TypeScript Generic -与另一个对象相同的键,但所有类型均为“any”

l7mqbcuq  于 2023-05-23  发布在  TypeScript
关注(0)|答案(2)|浏览(156)

给定类Foo

class Foo {
   foo: string;
   bar: number;
   baz: Date;
}

我想创建一个名为Transmuted<T>的泛型类型,它将返回这个接口:

interface TransmutedFoo {
   foo: any
   bar: any
   baz: any
}

如何创建此泛型?

yyhrrdl8

yyhrrdl81#

使用class Foo {/*...*/}时,TypeScript会创建一个名为Foo的类型来表示类的示例。所以从根本上讲,你的问题归结为:如何将一个对象类型转换为具有相同键的另一个类型?
答案是Map类型:

type Transmuted<T> = {
    [Key in keyof T]: any;
};

[Key in keyof T]列出了T的属性键,:后面显示的是这些属性的类型。在本例中,它是一个非常简单的Map类型,因为它将所有内容Map到any
将其应用于Foo,我们可以得到:

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; } .)所以你可以这样做:

type Transmuted<T> = Record<keyof T, any>;

Playground链接

mznpcxlj

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分配为每个属性的类型。希望这有帮助!

相关问题