TS面试题
1.TS有哪些类型(对比与js)?
关键字/语法 | 用途 | 示例 |
| 关闭类型检查 |
|
| 类型安全的 any |
|
| 永不存在的值 |
|
| 无返回值 |
|
| 枚举 |
|
| “或”关系 |
|
| “且”关系 |
|
| 精确值 |
|
| 只读属性 |
|
|
| |
| 取键联合 |
|
| 取变量类型 |
|
|
| |
| 保证表达式符合某类型并推断更精确类型 | |
条件类型 |
| |
| 在条件类型里提取子类型 | |
映射类型 |
| |
模板字符串类型 |
|
2.type和interface的区别?何时用哪个?
在 90 % 的日常代码里两者可以互换;但 interface
可以同名自动合并、被类实现/继承,而 type
可以做联合、交叉、元组等更复杂的复合类型。官方推荐:描述对象形状优先用 interface
,需要组合、映射、条件类型时用 type
维度 | interface | type |
官方定位 | 描述“对象形状”(shape / contract) | 描述任意“类型表达式” |
能否同名合并(Declaration Merging) | ✅ 自动合并 | ❌ 重复定义即报错 |
继承 / 实现 | • | ❌ 不能被类实现 |
联合类型(|) | ❌ 不支持 | ✅ |
交叉类型(&) | ❌ 不支持 | ✅ |
元组 / 映射 / 条件 / infer | ❌ 不支持 | ✅ 支持全部高级类型体操 |
基本对象描述 | ✅ | ✅ |
递归类型 | ✅ 支持 | ✅ 支持 |
运行时表现 | 完全擦除,无差异 | 完全擦除,无差异 |
对象、继承、合并用 interface;其余复杂场景用 type
3.什么是类型断言?如何使用?
类型断言(Type Assertion) 就是「开发者比编译器更懂类型,手动告诉它」的语法糖;它只在 编译阶段 起作用,运行时无任何效果
语法 | 示例 | 备注 |
尖括号(不推荐 JSX 环境) |
| 易与 JSX 混淆 |
as 写法(推荐) |
| 通用、可读性高 |
4.什么是泛型?
泛型是一种在定义函数、接口或类时不预先指定具体类型,而在使用时再指定类型的特性
用 T(或其他大写字母)作为“泛型”占位符,让同一段代码能够复用于不特定的数据类型
// 一颗星 T:传入什么类型,就返回什么类型
function echo<T>(value: T): T {return value;
}echo<string>('hello'); // T 点亮成 string
echo<number>(42); // T 点亮成 number
5.装饰器是什么,如何使用?
装饰器是一种特殊类型的声明,可以附加到类、方法、访问符、属性或参数上。本质是函数
// 类装饰器
function sealed(constructor: Function) {Object.seal(constructor);Object.seal(constructor.prototype);
}@sealed
class Greeter {greeting: string;constructor(message: string) {this.greeting = message;}greet() {return "Hello, " + this.greeting;}
}// 方法装饰器
function log(target: any, propertyKey: string, descriptor: PropertyDescriptor) {let originalMethod = descriptor.value;descriptor.value = function(...args: any[]) {console.log(`Calling ${propertyKey} with`, args);return originalMethod.apply(this, args);};return descriptor;
}class Calculator {@logadd(x: number, y: number) {return x + y;}
}
6.讲解一下ts的枚举?
TypeScript 枚举在编译期生成一个键值双向映射对象(数字 enum)或单向对象(字符串 enum),既能当类型又能当值;使用 const enum
可彻底消除运行时开销
TypeScript 中的枚举(Enums)是一种特殊的对象类型,它允许我们定义一组命名常量。这使得代码更具可读性和可维护性,尤其是在处理一组固定的值时非常有用。
enum Direction {Up,Down,Left,Right,
}
console.log(Direction.Up); // 输出 0
enum Direction {Up = "UP",Down = "DOWN",Left = "LEFT",Right = "RIGHT",
}
console.log(Direction.Up); // 输出 "UP"