1、type与interface
interface描述对象、类的结构
type将一个函数签名、一组联合类型、一个工具类型等等抽离成一个完整独立的类型
区别:
interface可以合并声明,但是type会提示重复定义(interface可以定义多次,但同一个type只能定义一次)
interface和type都可以实现继承,type是通过 & 交叉类型继承的,interface是使用extends继承
type res = {
code: 10001 | 1002;
status: 'success' | 'failure'
}
type res2 = res & {
data: any
}
interface res {
code: 10001 | 1002;
status: 'success' | 'failure'
}
interface res2 extends res {
data: any
}
2、字面量类型和联合类型
interface ResProps = {
code: 1000 | 10001 | 1004,
status: 'success' | 'failed',
data: any
}
上面的code和status,确定了值的集合,可以获取精确的提示,因为一般code和status都是和后端约定好的一些固定值。
字面量类型:
上文的status就是字面量类型,它比原始类型更为精确,可以分为一下几类
- 字符串字面量类型
- 数字字面量类型
- 布尔值字面量类型
- 对象字面量类型
它通常和联合类型使用,表示一组字面量类型。
interface Tmp {
bool: true | false;
num: 1 | 2 | 3;
str: "lin" | "bu" | "du"
}
联合类型:
联合类型的常用场景之一是通过多个对象类型的联合
interface Tmp {
user: {
| {
vip: true;
expires: string;
}
| {
vip: false;
promotion: string;
}
}
}
根据vip类型来推导其他的类型。
3、枚举
enum xxx {
HOME = 'localhost',
DEV_URL = 'xxxxx'
}
枚举和对象的区别:
枚举是双向映射的,对象是单向映射,例如:
enum Items {
Foo,
Bar,
Baz
}
const fooValue = Items.Foo; // 0
const fooKey = Items[0]; // "Foo"
仅有值为数字的枚举成员才能够进行这样的双向枚举,字符串枚举成员仍然只会进行单次映射
常量枚举,只是比普通枚举多了一个const,她只能通过枚举成员访问枚举值。