面试题:https://github.com/semlinker/awesome-typescript/discussions
TS 体操:https://github.com/semlinker/awesome-typescript/issues

1. 聊聊你对 TS 类中 public、private、protected、readonly 修饰符的理解?

题目地址:点击查看

按照字面意思先看下这几个词:

  • public:公共的,公开的;
  • private:私有的,私人的;
  • protected:受保护的;
  • readonly:只读的;

从这几个词的含义,大致知道这几个修饰符是做啥事的。
在 TypeScript 的类中,可以用这几个修饰符来修饰其中的属性或方法。其中:

  • public 修饰符是默认成员属性或方法都是,可以在任何地方访问;
  • private 修饰符修饰的属性或方法是私有的,不能在声明它的类的外部访问;
  • protected修饰符修饰的属性或方法将受保护,仅仅只能在其子类中访问;
  • readonly 修饰符修饰的属性只读,只允许出现在属性声明或者索引签名或者构造函数中,可以防止被修改;

文档地址:

2. TypeScript 中 const 和 readonly 的区别?

题目地址:点击查看

先看看两者作用:

  • const 声明一个常量,在定义时可以赋值,之后都不能修改;
  • readonly 修饰符修饰的属性只读,无法修改,必须定义在属性或索引签名或构造函数。

实质上,我们定义属性时通过 readonly 修饰属性后,可以防止被重新赋值,但这只是在编译时进行检查,编译完成后,readonly 就会被去除,而 const 定义的变量,在运行时也会进行检查。

详细分析可以看看:Difference between const and readonly in typescript

3. 列举你工作中常用的 TS 内置工具类型并描述一下它们的作用

题目地址:点击查看

业务中常用的比较多:

  • Partial<Type>:将指定类型的所有属性转换为可选类型,并且返回转换后的新类型;
  • Pick<Type, Keys>:从指定类型中,选择一组需要的类型,并且返回选择后的新类型。常常在定义子类型的时候会去取。

完整的内置工具类型,可以查看官方文档学习:Utility Types

4. TypeScript 中 any、never、unknown、null & undefined 和 void 有什么区别?

题目地址:点击查看

每个类型作用如下:

  • any:表示任意类型,不做约束,是 TS 不写类型声明时的默认类型,编译时会直接跳过其类型检查。
  1. let name: any = 'leo';
  2. name = 999;
  3. name = true;
  4. // ...

详细介绍可以看文档:any

  • never:表示永不存在的类型,TypeScript 2.0 引入,出现永不存在的返回类型的场景有”函数内执行出错,抛出异常,就不会有返回值“,比如:

    1. // 返回never的函数必须存在无法达到的终点
    2. function error(message: string): never {
    3. throw new Error(message);
    4. }

    never类型是所有类型的子类型,它可以赋值给任何类型;同时也没有类型是 never 的子类,除了 never 自身。 即使 any也不可以赋值给never。
    详细介绍可以看文档:never

  • unknown:表示未知类型,TypeScript 3.0 引入,当不确定类型的时候可以使用,它可以被赋值给任何类型,但不能被赋值给出了 anyunknown 之外的类型,并且不允许执行 unknown 类型的变量方法(any 可以)。

    1. let name: unknown = 'leo';
    2. name = 999;
    3. name.toString(); // Object is of type 'unknown'.(2571)

    详细介绍可以看文档:unknown

  • null & undefined:这是两种 TS 的类型,默认情况下,nullundefined 是所有类型的子类型,可以

详细介绍可以看文档:null and undefined

  • void:表示无任何类型,可以理解成和 any 类型相反,当函数没有任何返回值时使用,隐式返回 undefined,当变量声明为 void 类型时,该变量可以分配给 undefinednull 或者 void 类型的值。

注意:如果 ts 配置文件设置了 "strictNullChecks": false,则分配 null 类型的值也报错。
详细介绍可以看文档:void