const vs readonly
const 用于修饰变量,readonly 用于变量的属性
ts
const x: boolean;
const x: {
readonly a: boolean;
} = {
a: true;
};
对于数组,const 只能保证地址不改动,ReadonlyArray<Number>
则可以直接禁用 push/pop
never vs unknown vs null vs undefined
- never 代表永远不会发生的类型,一般是被自动分配的,当然也可以自己给变量做类型注释
ts
function f1() {
while (true) {}
}
function f2() {
throw new Error('error');
}
f1
和f2
都是永远返回不了的,称它们的返回值类型为是 never
- unknown 不知道是啥类型,但是肯定不是已知的类型,这是它和 any 最大的不同
ts
let vAny: any = 10; // ok
let vUnknown: unknown = 10; // ok
let s1: string = vAny; // ok
let s2: string = vUnknown; // Invalid; we can't assign vUnknown to any other type (without an explicit assertion)
- undefined 是未定义,null 是空
enum vs const enum
常量枚举经过编译器编译就是一个数字(0),单纯的 enum 会保留对象(Color.Red),所以常量枚举性能更好
btw,默认 enum 转 number 是 0,1,2...
但是如果指定其中的一个值,后面的会跟着列出来
ts
enum Colors {
Red,
Blue = 5,
Yellow,
}
console.log(Colors.Red); // 0
console.log(Colors.Blue); // 5
console.log(Colors.Yellow); // 6
enum 支持反向映射
ts
console.log(Colors.Red); // 0
console.log(Colors[0]); // Red
type vs interface
- type 可作为基本类型的别名
- type 可声明 union
type Pet = Dog | Cat
- type 可声明元组类型(tuple)
type PetList = [Dog, Pet]
- interface 能够声明合并
ts
interface A {
a: string;
}
interface A {
b: number;
}
// A 为 {
// a: string;
// b: number;
// }