TypeScript 面试题
Q:any、unknown、never 的区别是什么
A:两者都是顶级类型(top type),任何类型的值都可以赋值给顶级类型变量
let foo: any = 123; // 不报错
let far: unknown = 123; // 不报错
但是 unknown 比 any 的类型检查更严格,any 什么检查都不做,unknown 要求收窄类型:
const value: unknown = 'Hello World';
const someString: string = value;
// 报错 Type 'unknown' is not assignable to type 'string'.(2322)
const value: unknown = 'Hello World';
const someString: string = value as string; // 不报错
如果改成 any,基本在哪都不报错。所以能用 unknown 就优先用 unknown,类型更安全一点
never
never 是底类型,表示不应该出现的类型,这里有一个尤雨溪给出的例子
interface A {
type: 'a'
}
interface B {
type: 'b'
}
type All = A | B
function handleValue(val: All) {
switch (val.type) {
case 'a':
// 这里 value 被收窄为 A
break;
case 'b':
// val 在这里为 B
break;
default:
// val 在这里是 never
cont exhaustiveCheck: never = val
break;
}
}
Q:interface 和 type 的区别
A:
区别1:interface 只能描述对象,type 则描述所有数据类型
区别2:type 只是别名,interface 则是类型声明
区别3:type 不可重新赋值,interface 自动合并
所以一般对外 API 尽量用 interface,方便扩展;对内 API 尽量用 type,防止代码分散
Q:什么是联合类型和类型收窄
A:联合类型表示取值可以为多种类型中的一种
类型收窄是指在代码执行过程中通过一些检查将联合类型狭窄到一个特点类型
Q:TS 工具类型 Partial、Required、Readonly、Exclude、Extract、Omit、ReturnType 的作用和实现?
A:
- Partial 部分类型
- Required 必填类型
- Readonly 只读类型
- Exclude 排除类型
- Extract 提取类型
- Omit 排除 key 类型
- ReturnType 返回值类型
Q:ts 中的 this 和 js 中的 this 有什么差异
A: 一:静态类型检查
TypeScript 是一种强类型语言,它允许开发者在编写代码时指定 this
的类型。这对于确保 this
关键字在方法中使用时的正确性非常重要。例如,TypeScript 支持在类中通过类型注解来指定 this
的类型,这有助于避免运行时错误。
二:作用域和绑定
在 TypeScript 中,this
的解析更倾向于遵循词法作用域,这使得它在类方法和嵌套函数中能够更准确地解析出 this
的值。例如,使用箭头函数时,this
的值会继承自外层上下文。这在 JavaScript 中同样适用,但 TypeScript 提供了更强的语法支持与提示。
三:丢失 this
的处理
TypeScript 通过类型系统帮助识别 this
的丢失问题,并提供解决方案,比如使用类型声明或更改函数绑定。而在 JavaScript 中,开发者需要手动使用 bind()
, call()
, 或 apply()
方法来确保 this
的正确绑定。
Q:在 TypeScript 中使用 JavaScript 库,几种常用的方法
A: 1.直接使用,添加 // @ts-ingore
2.下载 @types/xxx
类型包
- 如果没有,新建一个 xxx.d.ts 文件
3.声明全局类型
Q:什么是泛型(generic)
A:
泛型(Generic Types)即多种类型。允许开发者在编写函数或类时,不预先确定具体的数据类型,而是使用类型参数来表示。
函数的本质是什么?
推后执行的、部分待定的代码