定义数据类型的方式有三种:type
, interface
and class
。
keyof
用来查询数据类型的索引的联合类型,例如
interface User {
name: string;
age: number;
gender: "male" | "female";
}
type A = keyof User;
// type A = "name" | "age" | "gender"
type B = keyof User[];
// type B = number | "length" | "push" | ...
// User[] 本质上是一个 Array 对象
type C = keyof { [x: string]: User };
// type C = string | number
// x: string 意味着任何一个数值或者字符串都可以作为键
class Person {
name: string = "barwe";
}
type D = keyof Person; // type D = "name";
[]
可用于访问数据类型某个属性的类型,格式与访问数据某个属性的值相似:
type E = User["name"]; // string
type F = string["charAt"]; // (pos: number) => string
type G = string[][0]; // string
特别的,如果一个程序中分两次对同一个接口声明了不同的内容,例如:
interface A {
name: string;
}
interface A {
name: string;
age: number;
gender: "male" | "female";
}
keyof A
将得到它们各自公共属性字面量联合声明的联合声明,即相当于:
type B = keyof A
// 等价于
type B = "name" | "age" | "gender"
与之相对的,为[]
指定一个公共属性字面量的联合声明,会得到一个由属性的类型组成的联合声明:
type C = A["name" | "age"]
// 等价于
type C = string | number
评论区