let str: string = 'hello';
let num: number = 123;
let flag: boolean = true;
let u: undefined = undefined;
let n: null = null;
let arr: number[] = [1, 2, 3];
let tuple: [string, number] = ['Tom', 25];
enum Direction {
Up,
Down,
Left,
Right,
}
let a: any = 123; // 可绕过检查(不推荐)
let b: unknown = 'xxx'; // 必须类型断言后使用(推荐)
function log(): void {
console.log('ok');
}
function error(): never {
throw new Error('err');
}
interface Person {
name: string;
age?: number; // 可选属性
}
type Point = {
x: number;
y: number;
};
面试常考区别:
interface
可被扩展(继承、合并),type
更灵活(联合、交叉)- 推荐优先使用
interface
定义对象结构
let name = 'Tom'; // 推断为 string
function isString(val: unknown): val is string {
return typeof val === 'string';
}
let value: string | number;
type Admin = { role: string };
type User = { name: string };
type AdminUser = Admin & User;
function identity<T>(arg: T): T {
return arg;
}
interface Box<T> {
value: T;
}
function getLength<T extends { length: number }>(val: T) {
return val.length;
}
type IsString<T> = T extends string ? true : false;
工具类型 | 作用 |
---|---|
Partial |
将 T 的所有属性变为可选 |
Readonly |
所有属性只读 |
Pick |
选择部分属性 |
Omit |
排除部分属性 |
Record |
构造键值对类型 |
ReturnType |
提取函数返回类型 |
答:
type
更灵活,可表达联合类型、元组、映射类型;interface
更适合对象类型定义,支持声明合并;interface
,其他用 type
。interface AnyObject {
[key: string]: any;
}
function map<T, U>(arr: T[], fn: (item: T) => U): U[] {
return arr.map(fn);
}
function firstElement<T extends any[]>(arr: T): T[0] {
return arr[0];
}
误区 | 正确做法 |
---|---|
认为 any 就是万能解决方案 |
尽量避免 any ,推荐使用 unknown 或具体类型 |
用 type 重复定义对象类型 |
使用 interface 更适合扩展性和结构清晰 |
忽略了默认 strict 模式的重要性 |
开启 strict 模式保障类型安全 |
不理解 never 类型的实际意义 |
never 表示永远不会有返回(抛错/死循环) |
TypeScript 类型系统是前端工程化的根基,尤其在大型项目中提供了强大的类型约束和智能提示。掌握类型定义、泛型、工具类型等核心概念,不仅能写出更稳定的代码,也是中高级前端面试的必答项。