前面两天的文章中我们谈到泛型(generics)的使用,以及如何透过 extends
来限制泛型可被带入的型别。在後面的内容中,会越来越着重在如何透过 type 来产生另一个 type。
今天就来看看 keyof
的使用。
keyof
顾名思义就是把「物件型别(object type)」的 key 拿出来,但要留意的是,这里提到的是「物件型别」,而不是真的「物件」,前者是 TypeScript 的型别,後者是 JavaScript 中的一个物件(object):
// Person 是一个 object type
type Person = {
firsName: string;
lastName: string;
};
// person 是 JavaScript 的 object (value)
const person = {
firstName: 'Aaron',
lastName: 'Chen',
};
如果不小心把真正的 object 当成 typescript 的 type 来使用的话,因为它不是型别的缘故,TypeScript 是会报错的:
而这里提到的 keyof
就只能用在「物件型别」上,使用方式非常简单:
// Person 是一个 object type
type Person = {
firsName: string;
lastName: string;
};
type PersonKey = keyof Person;
滑鼠移到 PersonKey
上後将会看到:
实际上的意思则是 "firsName" | "lastName"
:
简单来说,透过 keyof
operator,就可以取出物件型别的 key,并建立成一个新的 type:
由於「物件型别(object types)」的属性名称不一定是 string
,也有可能是 number
symbol
,因此若有需要的话,可以搭配交集(&
)的使用,也就是 & string
:
type PersonKey = keyof Person & string;
注:「物件型别」的 key 可以是
string
、number
或symbol
,但 JavaScript 中「物件」的 key 只会是string
或symbol
。
这时候 TS 就会明确知道说你要取出的是型别为 string 的 object key:
在 TypeScript 中,透过 keyof
则可以看到 any
的型别是 string | number | symbol
:
type KeyOfAny = keyof any; // type KeyOfAny = string | number | symbol
也就是说,在 TypeScript 中,能接受作为 key 的型别只能是 string、number 或 symbol,其他的型别像是 boolean 或 function 是不能被当作 key 的。
当我们试着把 object key 指定为 boolean 时,TS 会报错:
>>: [重构倒数第12天] - Vue3 directive 与 Skeleton 实战组合应用
我们前面讲过一些 C# 中的运算符,如,加、减,等等。今天我们补充两个特殊的运算符,is 和 as ...
上次说到了在特徵子集 Q 之下 被特徵子集 P 细分的程度 如果是 1 则表示 P 可以完全分类 Q...
今天来将画面做好,我们面对的资料长这样。 需求: 通常一个使用者的 form 表单是用在新增/编辑资...
https://motion-project.github.io/motion_config.htm...
前言 TensorFlow是一个开源软件库,用於各种感知和语言理解任务的机器学习。目前被50个团队用...