什么是TypeScript?
TypeScript 是一门静态类型、弱类型的语言
TypeScript和JavaScript有什么不同?
TypeScript 是 JavaScript 的超集,扩展了 JavaScript 的语法,因此现有的 JavaScript 代码可与 TypeScript 一起工作无需任何修改,TypeScript 通过类型注解提供编译时的静态类型检查。
TypeScript 可处理已有的 JavaScript 代码,并只对其中的 TypeScript 代码进行编译。
列出使用Typescript的一些优点?
(1)增强代码的可读性和可维护性,强类型的系统相当于最好的文档,在编译时即可发现大部分的错误,增强编辑器的功能。
(2)包容性,js文件可以直接改成 ts 文件,不定义类型可自动推论类型,可以定义几乎一切类型,ts 编译报错时也可以生成 js 文件,兼容第三方库,即使不是用ts编写的
(3)有活跃的社区,大多数的第三方库都可提供给 ts 的类型定义文件,完全支持 es6 规范
列出在Typescript中的内置类型
1:Partial
作用:生成一个新类型,该类型与 T 拥有相同的属性,但是所有属性皆为可选项,但只支持处理 第一层的属性
2:Required
作用:生成一个新类型,该类型与 T 拥有相同的属性,但是所有属性皆为必选项
3:Readonly
作用:将某个类型所有属性变为只读属性,也就意味着这些属性不能被重新赋值
4:Pick
作用:某个类型中挑出一些属性出来
5:Record
作用:是将 K 中所有的属性的值转化为 T 类型
6:ReturnType
作用:获得函数返回值的类型
7:Exclude
作用:将某个类型中属于另一个的类型移除掉
8:Extract
作用:作用是从 T 中提取出 U 。
9:Omit
作用:生成一个新类型,该类型拥有 T 中除了 K 属性以外的所有属性
10:NonNullable
作用:用来过滤类型中的 null 及 undefined 类型。
如何编译Typescript文件?
1:手动编译
2:设置自动编译
3:解析编译
4:动态编译
TS的接口是什么意思?
提供一个可以继承的,其他变量可以选择使用的范式
type 和 interface的异同
1:type和interface的相同点:都是用来定义对象或函数的形状。
2:type可以声明基本类型别名、联合类型、元组等类型
3:type语句中可以使用typeof获取实例的类型进行赋值
4:interface支持同时声明,默认导出
5:interface可以重复声明,最终会合并在一起,type只能声明一次
什么是泛型, 泛型的具体使用?
泛型:是一种未知的数据类型,但我们不知道使用什么数据类型的时候,可以使用泛型。泛型也可以看作是一个变量,用来接收数据类型
什么是any类型,何时使用?
any 是任意值类型,定义为 any 类型的变量允许被赋值为任意类型。
定义变量时,变量的数据来源于接口,而接口数量多,定义起来稍显繁杂,所以不进行定义,使用any;
由于变量定义为any,使用该变量进行处理时,也只能使用any
说说数组在TypeScript中是如何工作的?
- 第一种方式:类型 + []表示法
- 第二种方式:接口
- 第三种方式:any
什么是void,什么时候使用void类型?
void 意思就是“无类型”,而void *表示“无类型指针”,可以指向任何类型的数据。
- 对函数返回的限定。
- 对函数参数的限定。
never 和 void 的区别?
用于函数时, never 表示函数用于执行不到返回值那一步(抛出异常或死循环)的返回值类型,即永不存在的值的类型,而 void 则表示没有返回值,不返回或返回 undefined
TypeScript中的类型断言是什么?
TypeScript 允许覆盖它的推断,并且能以任何想要的方式分析它,这种机制被称为「类型断言」
TypeScript 中的“as”语法是什么?
as关键字表示断言
在Typescript中,表示断言有两种方式。一种是扩号表示法:
另一种使用as关键字:
TypeScript中的枚举是什么?
枚举是一个被命名的整型常数的集合,用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型
通俗来说,枚举就是一个对象的所有可能取值的集合
any 和unknown 有何区别?
unknown和any都是TS中的顶级类型,但主要区别在于:使用any相当于彻底放弃了类型检查,而unknown类型相较于any更加严格,在执行大多数操作之前,会进行某种形式的检查。
什么是交叉类型?
交叉类型是将多个类型合并为一个类型。 这让我们可以把现有的多种类型叠加到一起成为一种类型,它包含了所需的所有类型的特性
什么是函数重载?作用是什么?
重载:就是函数或者方法有相同的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者重载方法。
作用:重载的最直接作用是方便了程序员可以根据不同的参数个数,顺序,类型,自动匹配方法,减少写过个函数名或方法名的重复步骤。
const和readonly的区别
const是静态常量,const是编译时常量;readonly是动态常量,是运行时常量,const较高效,readonly较灵活。
什么是字面量类型?
字面量也就是 JavaScript 基元类型具体的值。而在 TypeScript 中,我们可以将字面量作为一种自定义的类型,这种类型被称为字面量类型。
函数形状有几种定义方式?
用接口定义函数的形状
可以保证以后对函数名赋值时保证参数个数、参数类型、返回值类型不变
什么是元组?
列表是可以修改的数据结构,而元组是固定长度,不能被修改元素值的数据结构。
元组是使用圆括号()表示,而列表是使用方括号[]。请注意两者的区别
什么是泛型约束?
泛型约束是指对泛型类型参数施加限制,用于限制可以传递到该类型参数的类型种类。
操作符keyof的作用是什么?
对一个对象类型使用 keyof 操作符,会返回该对象属性名组成的一个字符串或者数字字面量的联合类型
操作符infer的作用是什么?
infer的作用是让TypeScript自己推断,并将推断的结果存储到一个类型变量中,infer只能用于extends语句中。
操作符extends的作用是什么?
- 表示继承/拓展
- 表示约束
- 表示分配
请写出内置工具Readonly的源码形状并说明其作用
type Readonly<T> = {
readonly [p in keyof T]: T[P]
}
作用:将某个类型所有属性变为只读属性,也就意味着这些属性不能被重新赋值
请写出内置工具Required的源码形状并说明其作用
type Require<T> = {
[p in keyof T]-?: T[P]
}
作用:生成一个新类型,该类型与 T 拥有相同的属性,但是所有属性皆为必选项