typescript - 根据在打字稿中作为参数接收的类定义方法返回类型
问题描述
是否可以根据参数接收到的类的静态属性来强制函数的返回类型?
在下面的代码中,我希望变量 foo 的类型为 Date,等于returnType
作为参数接收的类的属性,但我不知道它是如何完成的,或者是否可能。
function register<T extends { new(...n: any[]): {} }>(constructor: T, ...args: ConstructorParameters<T>) {
// the error \\
return <constructor.returnType><unknown>new constructor(...args);
}
class Clazz {
static returnType: Date
constructor(p1: string, p2: number, p3: object) { }
}
let foo = register(Clazz, "", 1, {});
请参见下图以更好地说明:
另一张图片来说明:
解决方案
首先,您可以创建一个类型以请求具有已returnType
定义(静态属性)的类:
type ClassWithReturnType = { new(...args: any[]): any; returnType: any; };
那么你知道你可以提取returnType
推理,像这样:
type ClassReturnType<T extends ClassWithReturnType> = T['returnType'] extends infer R ? R : never;
此时您只需要将函数声明更改为:
function register<T extends ClassWithReturnType>(constructor: T, ...args: ConstructorParameters<T>): ClassReturnType<T> {
return (new constructor(...args));
}
但是,对我来说听起来很奇怪的是,您正在调用new constructor()
并期望returnType
与T
. 这是不可能的,因为构造函数返回一个类 T 的实例。也许你喜欢将它用于其他目的/静态方法,但是我希望这能回答你的问题。
完整代码是: 游乐场链接
type ClassWithReturnType = { new(...args: any[]): any; returnType: any; };
type ClassReturnType<T extends ClassWithReturnType> = T['returnType'] extends infer R ? R : never;
function register<T extends ClassWithReturnType>(constructor: T, ...args: ConstructorParameters<T>): ClassReturnType<T> {
return (new constructor(...args));
}
class Clazz {
static returnType: Date;
constructor(p1: string, p2: number, p3: object) { }
}
let foo = register(Clazz, "", 1, {});
推荐阅读
- javascript - 如何将 PDF 嵌入 Firefox 的 html 页面的一部分
- vue.js - Vuetify 与 3rd 方表单组件 - 如何像 v-text-field 一样设置样式
- ruby-on-rails - 无法通过 Bundler 安装 gem。偏僻的: !偏僻的: !Push 被拒绝,无法编译 Ruby 应用程序。远程:远程:!推送失败
- javascript - 通过循环构建 JSON 数组
- python - Python:生成绝对路径
- git - (合并后)在拉取请求中未看到的更改在提交中看到
- macos - IOUSBInterfaceOpen 失败,但我可以通过卸下相机让它工作......这是怎么回事?
- jscript - 如何为 Summernote 的插入图像对话框设置图像扩展名
- python - 在 python 中迭代列表时扩展新列表中的元素
- c# - 使用 C# 请求 AWS EC2 SpotInstance 失败,参数 groupId 的 Value () is invalid