向我解释keyof typeof在TypeScript中的含义

例子:

enum ColorsEnum {
    white = '#ffffff',
    black = '#000000',
}

type Colors = keyof typeof ColorsEnum;

最后一行相当于:

type Colors = "white" | "black"

但是它是如何工作的呢?

我希望typeof ColorsEnum会返回"Object",然后keyof "Object"不会做任何有趣的事情.但我显然错了.

推荐答案

keyof接受一个对象类型并返回一个接受该对象的任何键的类型.

type Point = { x: number; y: number };
type P = keyof Point; // type '"x" || "y"'

const coordinate: P = 'z' // Type '"z"' is not assignable to type '"x" | "y"'.

typeof与TypeScript类型

typeof在javascript对象上调用时的行为与在typescript类型上调用时的行为不同.

  • TypeScript在运行时调用javascript值时使用javascript's typeof,并返回"undefined", "object", "boolean", "number", "bigint", "string", "symbol", "function"中的一个
  • TypeScript's typeof在类型值上被调用,但在类型表达式中也可以在javascript值上被调用.它还可以推断javascript对象的类型,返回更详细的对象类型.
type Language = 'EN' | 'ES'; 
const userLanguage: Language = 'EN';
const preferences = { language: userLanguage, theme: 'light' };

console.log(typeof preferences); // "object"
type Preferences = typeof preferences; // type '{language: 'EN''; theme: string; }'

因为第二个typeof preferences是在类型表达式中,所以实际上调用的是TypeScript自己的typeof,而不是javascript.

类型键

因为keyof是一个TypeScript概念,所以我们将其称为TypeScript的verion of typeof.

类型键将推断javascript对象的类型,并返回一个类型,该类型是其键的并集.因为它可以推断出键的确切值,所以它可以返回literal types的并集,而不仅仅是返回"string".

type PreferenceKeys = 类型键 preferences; // type '"language" | "theme"'

Typescript相关问答推荐

"@ clerker/nextjs/server没有名为clerkMiddleware的导入成员'

调用另一个函数的函数的Typescript类型,参数相同

TypScript在对象上强制执行值类型时推断对象文字类型?

ReturnType此索引方法与点表示法之间的差异

当类型断言函数返回假时,TypScript正在推断从不类型

在NextJS中获得Spotify Oauth,但不工作'

TypeScrip:基于参数的条件返回类型

未在DIST中正确编译TypeScrip src模块导入

通配符路径与每条路径一起显示

为什么我的一个合成函数不能推断类型?

Angular 15使用react 式表单在数组内部创建动态表单数组

如何使所有可选字段在打印脚本中都是必填字段,但不能多或少?

TypeScrip中的类型安全包装类

为什么我在这个重载函数中需要`as any`?

在Cypress中,是否可以在不标识错误的情况下对元素调用.Click()方法?

作为函数参数的联合类型的键

为什么我的函数arg得到类型为Never?

如何提取具有索引签名的类型中定义的键

为什么TS条件返回要求不明确的强制转换而不是精确的强制转换?

如何在Vuetify 3中导入TypeScript类型?