这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天
Ts小提问
any、never、unknown、null & undefined 和 void 有什么区别
any 任意类型
不做约束,是 TS 不写类型声明时的默认类型,编译时会直接跳过其类型检查,跟js就没区别了
never 永不存在的类型
场景有”函数内执行出错,抛出异常,就不会有返回值“
类型是所有类型的子类型,它可以赋值给任何类型;同时也没有类型是 never 的子类,除了 never 自身。 即使 any也不可以赋值给never。
unknown 未知类型
当不确定类型的时候可以使用,它可以被赋值给任何类型,但不能被赋值给出了 any 和 unknown 之外的类型,并且不允许执行 unknown 类型的变量方法(any 可以)。
null undefined
跟JS中一样的 默认情况下,null 和 undefined 是所有类型的子类型
void 无任何类型
可以理解成和 any 类型相反,当函数没有任何返回值时使用,隐式返回 undefined,当变量声明为 void 类型时,该变量可以分配给 undefined 、null 或者 void 类型的值。
注意:如果 ts 配置文件设置了 "strictNullChecks": false,则分配 null 类型的值也报错。
尽量不用 any,未知类型可以用 unknown,使用时用类型断言或守卫进行类型收缩
declare 关键字
可以通过 declare 关键字来告诉 TypeScript,你正在试图表述一个其他地方已经存在的代码,如:写在 JavaScript 或者是像浏览器和 Node.js 运行环境里的代码:
foo = 123; // Error: 'foo' is not defined 和:
declare var foo: any; foo = 123; // allow
如果一个文件有扩展名 .d.ts,这意味着每个根级别的声明都必须以 declare 关键字作为前缀。这有利于让开发者清楚的知道,在这里 TypeScript 将不会把它编译成任何代码,同时开发者需要确保这些在编译时存在。
const 和 readonly 的区别
- const 声明一个常量,在定义时可以赋值,之后都不能修改;
- readonly 修饰符修饰的属性只读,无法修改,必须定义在属性或索引签名或构造函数。
实质上,我们定义属性时通过 readonly 修饰属性后,可以防止被重新赋值,但这只是在编译时进行检查,编译完成后,readonly 就会被去除,而 const 定义的变量,在运行时也会进行检查。