面试 - Typescript

面试 - Typescript

  1. 什么是 TypeScript?

    • 一种 javascript 的超集,支持高级 js 语法,不能通过浏览器运行,需要编译器编译为 js
  2. 为什么用 TypeScript?优势是什么?

    • 对于开发人员更加友好,支持更高级语法。
    • 主要体现在 更少的出现值的类型错误,IDE 可以自动填充,更加智能
  3. TypeScript 中 const 和 readonly 的区别?枚举和常量枚举的区别?接口和类型别名的区别?

    • const 可以用于变量断言,比较方便将值变为只读内容,readonly 用于类型声明,通常用于对象上的某个属性
    • 枚举可支持的比较广泛,可完整支持内外部值计算,编译的结果是一个对象;常量枚举只能用它内部的值计算,编译的值是单个变量。常用的还是 普通枚举
    • 继承方式不同,interface 用 extend 关键字,type 用 &(和号), interface 只能用来描述对象, 而且重名的 interface 会合并,type 不可以重名。type 还可以用于其他类型,如基本类型(原始值)、联合类型、元组。
  4. TypeScript 中 any 类型的作用是什么?

    • 不清楚类型的一个值,值来源可能是动态的,失去了检查作用
  5. TypeScript 中 any、never、unknown、null & undefined 和 void 有什么区别?

    • any: 动态的变量类型(失去了类型检查的作用)
    • never: 是 TypeScript 中的底层类型,表示永远不存在的值的类型。例:一个从来不会有返回值的函数 或者 let foo: never; never 类型只能赋值给 never
    • unknown: 任何类型的值都可以赋给 unknown 类型,但是 unknown 类型的值只能赋给 unknown 本身和 any 类型。
    • null & undefined: 默认情况下 null 和 undefined 是所有类型的子类型, 就是任何值都可以成为 null 或 undefined,但项目中一般开启 ts 开启–strictNullChecks 严格检查都只能赋值给自身类型
    • void: 没有任何类型。函数没有一个返回值。 undefined 能赋值给 void
  6. TypeScript 中 interface 可以给 Function / Array / Class(Indexable)做声明吗?

    • 可以
  7. TypeScript 中可以使用 String、Number、Boolean、Symbol、Object 等给类型做声明吗?

    • 可以
  8. TypeScript 中的 this 和 JavaScript 中的 this 有什么差异?

    • TypeScript:noImplicitThis: true 的情况下,必须去声明 this 的类型,才能在函数或者对象中使用 this。
    • Typescript 中箭头函数的 this 和 ES6 中箭头函数中的 this 是一致的。
  9. TypeScript 中使用 联合类型访问 时有哪些注意事项?

    • 当 TypeScript 不确定一个联合类型的变量到底是哪个类型的时候,我们只能访问此联合类型的所有类型里共有的属性或方法
    1
    2
    3
    4
    5
    6
    7
    function getLength(something: string | number): number {
    return something.length;
    }

    function getString(something: string | number): string {
    return something.toString();
    }
  10. TypeScript 如何设计 Class 的声明?

  • 在声明类的时候,一般类中都会包含,构造函数、对构造函数中的属性进行类型声明、类中的方法。
  1. TypeScript 中如何联合枚举类型的 Key?
1
2
3
4
5
6
enum str {
A,
B,
C,
}
type strUnion = keyof typeof str; // 'A' | 'B' | 'C'
  1. keyof 和 typeof 关键字的作用?
  • keyof 获取类型上的 key 值, 可作用到基础数据类型
  • typeof 获取一个变量或对象的类型。
1
2
3
function prop<T extends object, K extends keyof T>(obj: T, key: K) {
return obj[key];
}
  1. TypeScript 中 ?.、??、!、!.、_、** 等符号的含义?
  • ?. 可选链: 遇到 null 和 undefined 可以立即停止表达式的运行。
  • ?? 空值合并运算符: 当左侧操作数为 null 或 undefined 时,其返回右侧的操作数,否则返回左侧的操作数。可以把它看作 || ,只是不包含 0
  • ! 非空断言运算符: x! 将从 x 值域中排除 null 和 undefined。就是将该变量内的 null 和 undefined 剔除,使其可以赋值 例:x!.toFixed(2) 排除了 x 是 null 和 undefined 的情况去使用方法
  • !. 在变量名后添加,可以断言排除 undefined 和 null 类型
  • _ 数字分割符: 分隔符不会改变数值字面量的值,使人更容易读懂数字 例:1_101_324
  • ** 求幂
  • 逻辑运算符: ||= , &&= , ??=
  1. 简单介绍一下 TypeScript 模块的加载机制?
  • 首先,编译器会尝试定位需要导入的模块文件,通过绝对或者相对的路径查找方式
  • 如果没有查找到对应的模块,编译器会尝试定位一个外部模块声明(.d.ts)
  • 如果还没找到就报错
  1. TypeScript 中对象展开会有什么副作用吗?
  • 展开对象后面的属性会覆盖前面的属性;
  • 仅包含对象自身的可枚举属性,不可枚举的属性将会丢失。
  1. 类型的全局声明和局部声明?
  • 查看文件是否包含 import、export,不包含就是全局声明
  1. TypeScript 中同名的 interface 或者同名的 interface 和 class 可以合并吗?
  • 同名的 interface 会自动合并,class 会自动使用同名的 interface
  1. 如何使 TypeScript 项目引入并识别编译为 JavaScript 的 npm 库包?
  • 选择安装 ts 版本,npm install @types/包名 –save;
  • 对于没有类型的 js 库,需要编写同名的.d.ts 文件
  1. TypeScript 的 tsconfig.json 中有哪些配置项信息?
  • files 是一个数组列表,用来指定待编译文件,在编译的时候只会编译包含在 files 中列出的文件。、
  • include & exclude 指定编译某些文件,或者指定排除某些文件。
  • compileOnSave:true 让 IDE 在保存文件的时候根据 tsconfig.json 重新生成文件。
  • extends 可以通过指定一个其他的 tsconfig.json 文件路径,来继承这个配置文件里的配置。
  • compilerOptions 编译配置项,如何对具体的 ts 文件进行编译
  1. TypeScript 中如何设置模块导入的路径别名?
  • 通过 tsconfig.json 中的 compilerOptions.paths 项来配置
  1. declare,declare global 是什么?
  • declare 是用来定义全局变量、全局函数、全局命名空间、全局模块、class 等
  • declare global 为全局对象 window 增加新的属性
  1. 对 TypeScript 类中成员的 public、private、protected、readonly 修饰符的理解?
  • public: 成员都默认为 public,被此限定符修饰的成员是可以被外部访问;
  • private: 被此限定符修饰的成员是只可以被类的内部访问;
  • protected: 被此限定符修饰的成员是只可以被类的内部以及类的子类访问;
  • readonly: 关键字将属性设置为只读的。 只读属性必须在声明时或构造函数里被初始化。
  1. 简述工具类型 Exclude、Omit、Merge、Intersection、Overwrite 的作用。
  • Exclude<T, U> 从 T 中排除出可分配给 U 的元素。
  • Omit<T, K> 的作用是忽略 T 中的某些属性。
  • Merge<O1, O2> 是将两个对象的属性合并。
  • Compute<A & B> 是将交叉类型合并
  • Intersection<T, U>的作用是取 T 的属性,此属性同样也存在与 U
  • Overwrite<T, U> 是用 U 的属性覆盖 T 的相同属性。
  • Patrial< T > 转化为非必选类型。
  1. 泛型的使用场景?
  • 书写上:泛型实际上就是 大写字母开头的 一个 单词或字母,需要写入尖括号内作为一个类型传入
  • 意义上:通常代表一种不确定的类型,可以理解为类型相当于值,传入了 Interface, Class 或 Function 中。经常与 extend 搭配使用,代表某些类型的子类表达与
    比如 <T extend unknown > 那么 T 就可以是 number, string 或其他可以赋值给 unknown 的类型
作者

Huasun47

发布于

2023-02-07

更新于

2023-02-07

许可协议