什么是类型运算符
在TS
中,类型系统是其最知名的功能,它让开发者能够在编码过程中更早地发现和修复错误,提高代码的可靠性和可维护性。类型运算符是TS
中的一个功能,它们允许开发者对已有的类型进行计算,得到新类型。 这篇文章将会详细的介绍TS
中的一些类型运算符。
keyof
运算符
keyof
接受一个对象类型作为参数,返回该对象的所有键名组成的联合类型。
TS
type MyObj = {
foo: number,
bar: string,
};
type Keys = keyof MyObj; // 'foo'|'bar'
keyof 的所有返回类型
由于对象的键名只有三种类型,所以对于任意对象的键名的联合类型就是string|number|symbol
。
TS
// string | number | symbol
type Keys = keyof any;
对于没有自定义键名的类型使用 keyof 运算符,返回never
类型,表示不可能有这样类型的键名。
由于object
类型没有自身的属性,也就没有键名,所以keyof object
返回never
类型。
TS
type Keys = keyof object; // never
如果对象属性名采用索引形式,keyof
会返回属性名的索引类型。
TS
// 示例一
interface T {
[prop: number]: number;
}
// number
type KeyT = keyof T;
// 示例二
interface T {
[prop: string]: number;
}
// string|number
type KeyT = keyof T;
对于联合类型,keyof
返回成员共有的键名。
TS
type A = { a: string; z: boolean };
type B = { b: string; z: boolean };
// 返回 'z'
type KeyT = keyof (A | B);
对于交叉类型,keyof
返回所有键名。
css
type A = { a: string; x: boolean };
type B = { b: string; y: number };
// 返回 'a' | 'x' | 'b' | 'y'
type KeyT = keyof (A & B);
// 相当于
keyof (A & B) ≡ keyof A | keyof B
in 运算符
JS
中,in
运算符用来确定对象是否包含某个属性名。
JS
const obj = { a: 123 };
if ('a' in obj) console.log('found a');
TS
语言的类型运算中,in
运算符有不同的用法,用来遍历联合类型的每一个成员类型。
TS
type U = 'a'|'b'|'c';
type Foo = {
[Prop in U]: number;
};
// 等同于
type Foo = {
a: number,
b: number,
c: number
};
方括号运算符
方括号运算符([]
)用于取出对象的键值类型,比如T[K]
会返回对象T
的属性K
的类型。
TS
type Person = {
age: number;
name: string;
alive: boolean;
};
// Age 的类型是 number
type Age = Person['age'];
方括号的参数如果是联合类型,那么返回的也是联合类型。
TS
type Person = {
age: number;
name: string;
alive: boolean;
};
// number|string
type T = Person['age'|'name'];
// number|string|boolean
type A = Person[keyof Person];
访问不存在的属性,则会报错。
TS
type T = Person['notExisted']; // 报错
方括号运算符的参数也可以是属性名的索引类型。
TS
type Obj = {
[key:string]: number,
};
// number
type T = Obj[string];
方括号里面不能有值的运算。
TS
const key = 'age';
type Age = Person[key]; // 报错
type Age = Person['a' + 'g' + 'e']; // 报错
extends...?: 条件运算符
TS
提供类似JS
的?:
运算符这样的三元运算符,但多出了一个extends
关键字。条件运算符extends...?:
可以根据当前类型是否符合某种条件,返回不同的类型。
TS
T extends U ? X : Y
is
运算符
函数返回布尔值的时候,可以使用is
运算符,限定返回值与参数之间的关系。is
运算符用来描述返回值属于true
还是false
。 写法采用parameterName is Type
的形式,即左侧为当前函数的参数名,右侧为某一种类型。它返回一个布尔值,表示左侧参数是否属于右侧的类型。
TS
type A = { a: string };
type B = { b: string };
function isTypeA(x: A | B): x is A {
return 'a' in x;
}