typescript - 如何指定类型是 TypeScript 中给定类类型的实例?
问题描述
我想创建一个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
如果您想知道这些实用程序是如何定义的,以及您的尝试有什么问题,请看这里:
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;
推荐阅读
- excel - Pandas Python 像 Excel 单元格锁
- google-chrome-extension - “chrome.permissions.request”中的起源是什么意思?
- r - R - Markdown - 带有固定标题的滚动框
- xamarin - 关闭应用程序后 Xamarin.IOS UILocalNotification.UserInfo 为空
- python - 为什么 plt.figure(figsize=(w,h)) 对 df.barh() 没有影响,但 plt.rcParams['figure.figsize'] = [w,h] 有影响?
- html - 语义 UI 项堆叠而不是跨行分布
- php - 在 null 上调用成员函数 userdata()
- python - 为什么标题的一部分是空的?
- javascript - 当你浏览一个 npm 模块时,你如何在代码中使用包?
- android - SharedPreferences - 这两种检索 Preference 值的方法之间的区别?