TypeScript高频面试题

  1. TypeScript有哪些基础类型

    • number: 数字
    • string: 字符串
    • boolean: 布尔
    • Symbol: es6的Symbol
    • Array: 数组(数组的每一项都必须是同一个类型)
    • Tuple: 表示一个已知元素数量和类型的数组, 各元素的类型不必要相同

      1. let tupleArr: [string, number] = ["hello", 1];
    • enum: 枚举类型是对JS标准数据类型的一个补充, 你可以规定一类数据结构为一个枚举类型 ```typescript enum Color { Red = “red”, Green = “green”, Blue = “blue” }

let color: Color; // 这个时候color就只允许被赋值为Color.Red, Color.Green, Color.Blue了

  1. - object: 对象
  2. - never: 代表一个永远不存在的值的类型, 比如一个死循环的函数的返回值就是never
  3. - void: 代表没有返回类型
  4. - null & undefined
  5. - any: any代表任意类型都接受, 我们一般用它来跳过类型检查
  6. 2. 什么是接口(interface)?
  7. - 接口帮助我们给我们代码或者第三方代码定义结构契约
  8. ```typescript
  9. interface {
  10. name: string;
  11. age?: number; // 代表age可有可无
  12. readonly parent: Array<string> // 代表只读
  13. }
  14. interface SearchFunc {
  15. (source: string, subString: string): boolean;
  16. }
  • 类可以实现接口 ```typescript interface ClockInterface { currentTime: Date; }

class Clock implements ClockInterface { currentTime: Date; // 当我们实现了接口以后, 我们的类里就必须要有接口的同名属性, 且必须是同类型 }

  1. - 接口是可以被继承的
  2. ```typescript
  3. interface Person {
  4. name: string;
  5. age: number
  6. }
  7. interface Man extends Person {
  8. wife: string
  9. }
  10. const man: Man; // man变量将必须存在name, age, wife三个属性
  1. 能说说TypeScript中三斜线指令吗?
    • 主要用的最多的就是<reference path="xxx">: 这个是用来告诉ts在编译过程中还需要引入哪些其他文件
  1. 有用过ts的装饰器吗?
    • 装饰器是一种特殊类型的声明, 他能够被附加到类声明, 方法, 访问符或者属性, 参数上, 装饰器格式为@expression的形式, expression必须是一个函数, 他会在运行时被调用, 被装饰的声明信息作为参数传入给该expression
    • 若要使用ts的装饰器, 我们需要在tsconfig.json中启用experimetalDecorators为true
    • 在ts中装饰器会由下往上依次被调用
    • 我们对属性进行装饰的时候有时候会用到reflect-metadata
  1. 交叉类型和联合类型
    • 交叉类型: `A & B & C
    • 联合类型: A | B | C
  1. 你知道有哪些TS内置好的工具类型吗?
    • Partail<T>: 将传入类型的属性全部变为可选
    • Readonly<T>: 将传入类型的属性全部变为只读
    • Record<P, T>: 他会将P中的每个字段都读出来, 作为属性名, 然后类型都为T
      ```typescript interface animalInfo { name: string; age: string } type animals = “dog” | “cat”;

const animals: Record = { “dog”: { name: “wangcai”, age: “18” }, “cat”: { name: “mimi”, age: “19” } }

  1. - `Pick<P, T>`: 意思是从P中剃取T类型过来形成一个新的类型
  2. ```typescript
  3. interface Man {
  4. name: string;
  5. age: number;
  6. wife: string
  7. }
  8. const person: Pick<Man, "name"| "age"> = {
  9. name: "alice",
  10. age: 18
  11. }
  • Omit<P, T>: 代表从P的类型声明中删除T
    ```javascript interface Man { name: string; age: number; wife: string }

const person: Omit = { name: “alice”, age: 19 }

  1. - `Exclude<T, U>`: T中剔除不可以赋值给U的类型(一般用于联合类型)
  2. ```javascript
  3. type Test = Exclude<"a" | "b", "b">; // Test类型就是"a"
  • Extract<T, U>: 从T中提取可以赋值给U的类型

    1. type Test = Extract<"a" | "b", "b">; // Test类型就是"b"
  • ReturnType<T>: 获取函数T类型的返回值类型

  • InstanceType<T>: 获取构造函数类型的实例类型
  • NonNullable<T>: 从T中剔除null和undefined类型的属性