给定类Foo
Foo
class Foo { foo: string; bar: number; baz: Date; }
我想创建一个名为Transmuted<T>的泛型类型,它将返回这个接口:
Transmuted<T>
interface TransmutedFoo { foo: any bar: any baz: any }
如何创建此泛型?
yyhrrdl81#
使用class Foo {/*...*/}时,TypeScript会创建一个名为Foo的类型来表示类的示例。所以从根本上讲,你的问题归结为:如何将一个对象类型转换为具有相同键的另一个类型?答案是Map类型:
class Foo {/*...*/}
type Transmuted<T> = { [Key in keyof T]: any; };
[Key in keyof T]列出了T的属性键,:后面显示的是这些属性的类型。在本例中,它是一个非常简单的Map类型,因为它将所有内容Map到any。将其应用于Foo,我们可以得到:
[Key in keyof T]
T
:
any
class Foo { foo: string; bar: number; baz: Date; constructor() { this.foo = ""; this.bar = 0; this.baz = new Date(); } } type Transmuted<T> = { [Key in keyof T]: any; }; type TransmutedFoo = Transmuted<Foo>; // ^? type TransmutedFoo = { foo: any; bar: any; baz: any };
Playground链接在这种情况下,由于您希望所有属性具有相同的类型,您可以使用内置的泛型类型Record<Keys, Type>,正如Aluan Haddad指出的,而不是像上面那样显式地编写。Record“构造一个对象类型,其属性键为Keys,属性值为Type。"(它的实现方式完全是我们上面所做的:{ [P in Keys]: Type; } .)所以你可以这样做:
Record<Keys, Type>
Record
{ [P in Keys]: Type; }
type Transmuted<T> = Record<keyof T, any>;
Playground链接
mznpcxlj2#
您可以通过创建泛型类型来实现这一点,在本例中我们将其称为Transmuted<T>。此泛型类型将把T的属性转换为any类型。请参阅下面的代码,了解如何实现它:
class Foo { foo: string; bar: number; baz: Date; } type Transmuted<T> = { [K in keyof T]: any; } type TransmutedFoo = Transmuted<Foo>
因此,我们使用Map类型来使用TypeScript keyof运算符迭代T的每个属性K,然后将类型any分配为每个属性的类型。希望这有帮助!
keyof
K
2条答案
按热度按时间yyhrrdl81#
使用
class Foo {/*...*/}
时,TypeScript会创建一个名为Foo
的类型来表示类的示例。所以从根本上讲,你的问题归结为:如何将一个对象类型转换为具有相同键的另一个类型?答案是Map类型:
[Key in keyof T]
列出了T
的属性键,:
后面显示的是这些属性的类型。在本例中,它是一个非常简单的Map类型,因为它将所有内容Map到any
。将其应用于
Foo
,我们可以得到:Playground链接
在这种情况下,由于您希望所有属性具有相同的类型,您可以使用内置的泛型类型
Record<Keys, Type>
,正如Aluan Haddad指出的,而不是像上面那样显式地编写。Record
“构造一个对象类型,其属性键为Keys,属性值为Type。"(它的实现方式完全是我们上面所做的:{ [P in Keys]: Type; }
.)所以你可以这样做:Playground链接
mznpcxlj2#
您可以通过创建泛型类型来实现这一点,在本例中我们将其称为
Transmuted<T>
。此泛型类型将把T
的属性转换为any
类型。请参阅下面的代码,了解如何实现它:因此,我们使用Map类型来使用TypeScript
keyof
运算符迭代T
的每个属性K
,然后将类型any
分配为每个属性的类型。希望这有帮助!