TS的类型运算符你都知道几个?

什么是类型运算符

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; 
}
相关推荐
herogus丶2 分钟前
【Chrome】‘Good助手‘ 扩展程序使用介绍
前端·chrome
独立开阀者_FwtCoder5 分钟前
面试官:为什么在 Vue3 中 ref 变量要用 .value?
前端·javascript·vue.js
NetX行者8 分钟前
基于Vue 3的AI前端框架汇总及工具对比表
前端·vue.js·人工智能·前端框架·开源
独立开阀者_FwtCoder8 分钟前
手握两大前端框架,Vercel 再出手拿下 Nuxt.js,对前端有什么影响?
前端·javascript·vue.js
独立开阀者_FwtCoder9 分钟前
弃用 html2canvas!快 93 倍的截图神器!
前端·javascript·vue.js
weixin_3993806923 分钟前
TongWeb8.0.9.0.3部署后端应用,前端访问后端报405(by sy+lqw)
前端
伍哥的传说44 分钟前
H3初识——入门介绍之常用中间件
前端·javascript·react.js·中间件·前端框架·node.js·ecmascript
洛小豆1 小时前
深入理解Pinia:Options API vs Composition API两种Store定义方式完全指南
前端·javascript·vue.js
洛小豆1 小时前
JavaScript 对象属性访问的那些坑:她问我为什么用 result.id 而不是 result['id']?我说我不知道...
前端·javascript·vue.js