Skip to content

TypeScript 面试题

Q:any、unknown、never 的区别是什么

A:两者都是顶级类型(top type),任何类型的值都可以赋值给顶级类型变量

typescript
let foo: any = 123; // 不报错
let far: unknown = 123; // 不报错

但是 unknown 比 any 的类型检查更严格,any 什么检查都不做,unknown 要求收窄类型:

typescript
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 是底类型,表示不应该出现的类型,这里有一个尤雨溪给出的例子

typescript
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 返回值类型

ts 中的 this 和 js 中的 this 有什么差异

一:静态类型检查

TypeScript 是一种强类型语言,它允许开发者在编写代码时指定 this 的类型。这对于确保 this 关键字在方法中使用时的正确性非常重要。例如,TypeScript 支持在类中通过类型注解来指定 this 的类型,这有助于避免运行时错误。

二:作用域和绑定

在 TypeScript 中,this 的解析更倾向于遵循词法作用域,这使得它在类方法和嵌套函数中能够更准确地解析出 this 的值。例如,使用箭头函数时,this 的值会继承自外层上下文。这在 JavaScript 中同样适用,但 TypeScript 提供了更强的语法支持与提示。

三:丢失 this 的处理

TypeScript 通过类型系统帮助识别 this 的丢失问题,并提供解决方案,比如使用类型声明或更改函数绑定。而在 JavaScript 中,开发者需要手动使用 bind(), call(), 或 apply() 方法来确保 this 的正确绑定。

参考资料