例:
向我解释keyof typeof
在TypeScript中的含义
enum ColorsEnum {
white = '#ffffff',
black = '#000000',
}
type Colors = keyof typeof ColorsEnum;
最后一行等效于:
type Colors = "white" | "black"
但是它是如何工作的呢?
我希望
typeof ColorsEnum
返回类似"Object"
的内容,然后keyof "Object"
不做任何有趣的事情。但是我显然是错的。 最佳答案
要了解Typescript中keyof typeof
的用法,首先需要了解什么是文字类型的文字类型和联合。因此,我将首先解释这些概念,然后分别详细解释keyof
和typeof
。之后,我将返回enum
回答问题中的要求。答案很长,但是示例很容易理解。
文字类型
Typescript中的文字类型是string
,number
或boolean
的更特定类型。例如,"Hello World"
是string
,但string
不是"Hello World"
。 "Hello World"
是string
类型的更具体的类型,因此它是文字类型。
文字类型可以声明如下:
这意味着type Greeting = "Hello"
Greeting
类型的对象只能具有string
值"Hello"
,而不能具有其他字符串值或任何其他类型的其他值,如以下代码所示:
文字类型本身并不是有用的,但是当与联合类型,类型别名和类型保护结合使用时,它们将变得强大。let greeting: Greeting
greeting = "Hello" // OK
greeting = "Hi" // Error: Type '"Hi"' is not assignable to type '"Hello"'
以下是文字类型的并集的示例:
现在,类型type Greeting = "Hello" | "Hi" | "Welcome"
Greeting
的对象可以具有值"Hello"
,"Hi"
或"Welcome"
。let greeting: Greeting
greeting = "Hello" // OK
greeting = "Hi" // OK
greeting = "Welcome" // OK
greeting = "GoodEvening" // Error: Type '"GoodEvening"' is not assignable to type 'Greeting'
仅keyof
某种类型的keyof
T
为您提供了一个新类型,它是文字类型的联合,这些文字类型是T
属性的名称。结果类型是字符串的子类型。
例如,考虑以下interface
:
在interface Person {
name: string
age: number
location: string
}
keyof
类型上使用Person
运算符将为您提供一个新类型,如以下代码所示:
此type SomeNewType = keyof Person
SomeNewType
是由类型"name" | "age" | "location"
的属性组成的文字类型(Person
)的并集。
现在,您可以创建SomeNewType
类型的对象:let newTypeObject: SomeNewType
newTypeObject = "name" // OK
newTypeObject = "age" // OK
newTypeObject = "location" // OK
newTypeObject = "anyOtherValue" // Error...
keyof typeof
一起放在一个对象上
您可能已经知道,typeof
运算符为您提供对象的类型。
在上面的Person
接口(interface)示例中,我们已经知道类型,因此,我们只需要在keyof
类型上使用Person
运算符即可。
但是,当我们不知道对象的类型或者只有一个值而不是像下面这样的值的类型时该怎么办?
这是我们一起使用const bmw = { name: "BMW", power: "1000hp" }
keyof typeof
的地方。typeof bmw
为您提供类型:{ name: string, power: string }
然后keyof
运算符为您提供文字类型的并集,如以下代码所示:type CarLiteralType = keyof typeof bmw
let carPropertyLiteral: CarLiteralType
carPropertyLiteral = "name" // OK
carPropertyLiteral = "power" // OK
carPropertyLiteral = "anyOther" // Error...
keyof typeof
上的enum
在 typescript 中,枚举是真实的对象。因此,以上对象的说明也适用于此。 OP在问题中给出的示例是:
这里enum ColorsEnum {
white = '#ffffff',
black = '#000000',
}
ColorsEnum
是一个对象,而不是类型。因此,我们需要一起调用keyof typeof
运算符,如以下代码所示:
而已!希望能有所帮助。type Colors = keyof typeof ColorsEnum
let colorLiteral: Colors
colorLiteral = "white" // OK
colorLiteral = "black" // OK
colorLiteral = "red" // Error...