面试 - Typescript
什么是 TypeScript?
- 一种 javascript 的超集,支持高级 js 语法,不能通过浏览器运行,需要编译器编译为 js
为什么用 TypeScript?优势是什么?
- 对于开发人员更加友好,支持更高级语法。
- 主要体现在 更少的出现值的类型错误,IDE 可以自动填充,更加智能
TypeScript 中 const 和 readonly 的区别?枚举和常量枚举的区别?接口和类型别名的区别?
- const 可以用于变量断言,比较方便将值变为只读内容,readonly 用于类型声明,通常用于对象上的某个属性
- 枚举可支持的比较广泛,可完整支持内外部值计算,编译的结果是一个对象;常量枚举只能用它内部的值计算,编译的值是单个变量。常用的还是 普通枚举
- 继承方式不同,interface 用 extend 关键字,type 用 &(和号), interface 只能用来描述对象, 而且重名的 interface 会合并,type 不可以重名。type 还可以用于其他类型,如基本类型(原始值)、联合类型、元组。
TypeScript 中 any 类型的作用是什么?
- 不清楚类型的一个值,值来源可能是动态的,失去了检查作用
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
TypeScript 中 interface 可以给 Function / Array / Class(Indexable)做声明吗?
- 可以
TypeScript 中可以使用 String、Number、Boolean、Symbol、Object 等给类型做声明吗?
- 可以
TypeScript 中的 this 和 JavaScript 中的 this 有什么差异?
- TypeScript:noImplicitThis: true 的情况下,必须去声明 this 的类型,才能在函数或者对象中使用 this。
- Typescript 中箭头函数的 this 和 ES6 中箭头函数中的 this 是一致的。
TypeScript 中使用 联合类型访问 时有哪些注意事项?
- 当 TypeScript 不确定一个联合类型的变量到底是哪个类型的时候,我们只能访问此联合类型的所有类型里共有的属性或方法
1
2
3
4
5
6
7function getLength(something: string | number): number {
return something.length;
}
function getString(something: string | number): string {
return something.toString();
}TypeScript 如何设计 Class 的声明?
- 在声明类的时候,一般类中都会包含,构造函数、对构造函数中的属性进行类型声明、类中的方法。
- TypeScript 中如何联合枚举类型的 Key?
1 | enum str { |
- keyof 和 typeof 关键字的作用?
- keyof 获取类型上的 key 值, 可作用到基础数据类型
- typeof 获取一个变量或对象的类型。
1 | function prop<T extends object, K extends keyof T>(obj: T, key: K) { |
- TypeScript 中 ?.、??、!、!.、_、** 等符号的含义?
- ?. 可选链: 遇到 null 和 undefined 可以立即停止表达式的运行。
- ?? 空值合并运算符: 当左侧操作数为 null 或 undefined 时,其返回右侧的操作数,否则返回左侧的操作数。可以把它看作 || ,只是不包含 0
- ! 非空断言运算符: x! 将从 x 值域中排除 null 和 undefined。就是将该变量内的 null 和 undefined 剔除,使其可以赋值 例:
x!.toFixed(2)
排除了 x 是 null 和 undefined 的情况去使用方法 - !. 在变量名后添加,可以断言排除 undefined 和 null 类型
- _ 数字分割符: 分隔符不会改变数值字面量的值,使人更容易读懂数字 例:1_101_324
- ** 求幂
- 逻辑运算符: ||= , &&= , ??=
- 简单介绍一下 TypeScript 模块的加载机制?
- 首先,编译器会尝试定位需要导入的模块文件,通过绝对或者相对的路径查找方式
- 如果没有查找到对应的模块,编译器会尝试定位一个外部模块声明(.d.ts)
- 如果还没找到就报错
- TypeScript 中对象展开会有什么副作用吗?
- 展开对象后面的属性会覆盖前面的属性;
- 仅包含对象自身的可枚举属性,不可枚举的属性将会丢失。
- 类型的全局声明和局部声明?
- 查看文件是否包含 import、export,不包含就是全局声明
- TypeScript 中同名的 interface 或者同名的 interface 和 class 可以合并吗?
- 同名的 interface 会自动合并,class 会自动使用同名的 interface
- 如何使 TypeScript 项目引入并识别编译为 JavaScript 的 npm 库包?
- 选择安装 ts 版本,npm install @types/包名 –save;
- 对于没有类型的 js 库,需要编写同名的.d.ts 文件
- TypeScript 的 tsconfig.json 中有哪些配置项信息?
- files 是一个数组列表,用来指定待编译文件,在编译的时候只会编译包含在 files 中列出的文件。、
- include & exclude 指定编译某些文件,或者指定排除某些文件。
- compileOnSave:true 让 IDE 在保存文件的时候根据 tsconfig.json 重新生成文件。
- extends 可以通过指定一个其他的 tsconfig.json 文件路径,来继承这个配置文件里的配置。
- compilerOptions 编译配置项,如何对具体的 ts 文件进行编译
- TypeScript 中如何设置模块导入的路径别名?
- 通过 tsconfig.json 中的 compilerOptions.paths 项来配置
- declare,declare global 是什么?
- declare 是用来定义全局变量、全局函数、全局命名空间、全局模块、class 等
- declare global 为全局对象 window 增加新的属性
- 对 TypeScript 类中成员的 public、private、protected、readonly 修饰符的理解?
- public: 成员都默认为 public,被此限定符修饰的成员是可以被外部访问;
- private: 被此限定符修饰的成员是只可以被类的内部访问;
- protected: 被此限定符修饰的成员是只可以被类的内部以及类的子类访问;
- readonly: 关键字将属性设置为只读的。 只读属性必须在声明时或构造函数里被初始化。
- 简述工具类型 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 > 转化为非必选类型。
- 泛型的使用场景?
- 书写上:泛型实际上就是 大写字母开头的 一个 单词或字母,需要写入尖括号内作为一个类型传入
- 意义上:通常代表一种不确定的类型,可以理解为类型相当于值,传入了 Interface, Class 或 Function 中。经常与 extend 搭配使用,代表某些类型的子类表达与
比如<T extend unknown >
那么 T 就可以是 number, string 或其他可以赋值给 unknown 的类型
面试 - Typescript