gpt4 book ai didi

typescript - 如何在 TypeScript 中指定类型是给定类类型的实例?

转载 作者:行者123 更新时间:2023-12-04 10:11:50 26 4
gpt4 key购买 nike

我想做一个Constructor将类作为类型参数并返回其构造函数签名的类型。

这对于定义静态属性很有用 make类上的方法可以创建该类的实例,而不是使用 new ClassInstance(...) 创建它声明。

这是我目前所得到的:

type ClassConstructorArgs<T> = T extends { new (...args: infer A): any }
? A
: never;

type Constructor<T> = (...args: ClassConstructorArgs<T>) => T;

class Person {
constructor(public name: string, public age: number) {}

static make: Constructor<typeof Person> = (...args) => new Person(...args);
// ^^^^^^^^^^^^^^^^^^^
// Type 'Person' is missing the following properties from type 'typeof Person': prototype, make
}

问题是静态 make有一个错误:Type 'Person' is missing the following properties from type 'typeof Person': prototype, make

我明白这是因为我的 Constructor类型错误,类的构造函数 T不要返回类 T本身而是 T 的一个实例.

但我不知道如何表达 Constructor返回 T 的实例而不是类T本身。这在 TypeScript 中甚至可能吗?

最佳答案

Typescript 为 ConstructorParameters 提供内置实用程序和 InstanceType :

type Constructor<T extends new (...args: any) => any> = 
(...args: ConstructorParameters<T>) => InstanceType<T>;

class Person {
constructor(public name: string, public age: number) {}

static make: Constructor<typeof Person> = (...args) => new Person(...args);
}

const p = Person.make('some name', 1); // p is of type Person

Playground


如果您想知道这些实用程序是如何定义的以及您的尝试有什么问题,请看这里:

type ConstructorParameters<T extends new (...args: any) => any> = 
T extends new (...args: infer P) => any ? P : never;

type InstanceType<T extends new (...args: any) => any> =
T extends new (...args: any) => infer R ? R : any;

Source

关于typescript - 如何在 TypeScript 中指定类型是给定类类型的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61299746/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com