TypeScript:实现泛型类型约束函数以实例化和返回特定类型的实例

TypeScript: Implementing a generic type-constrained function to instantiate and return instances of a specific type

提问人:laoguang 提问时间:8/30/2023 最后编辑:laoguang 更新时间:11/23/2023 访问量:34

问:

我想实现一个具有以下行为的函数:

GetComponent<T>(type : typeof T): T { ... } 

我希望这个函数接受一个构造函数作为参数,其中构造函数的类型是 T,并返回一个 T 类型的实例。

此外,如果提供的类型不匹配,我希望该函数导致编译错误。(如)。GetComponent<Vec2>(Vec3)

是否可以实现此功能?

如果有什么方法可以禁止抽象类型输入?

我尝试过这样的事情:

class Resources {
    static Load<T extends AssetObject>(type: typeof AssetObject, id: string): T {
        return Resources.load_sync_impl(id, type) as T;
    }
}

但是当我尝试编写 List 时,我找不到任何方法可以将输入参数限制为我在类中定义的类型:

class List<T> {
    constructor(type: any) {   <<======= i had to write it as any so it can support the private constructor class
        this._type = type;
    }
}

旧的解决方案是这样的

constructor(type: new (...args: any[]) => T);
TypeScript 泛型约束 类型特征

评论

0赞 jcalz 8/30/2023
欢迎来到 Stack Overflow!请编辑以使您的代码成为最小的可重现示例,我们可以复制并粘贴到我们自己的 IDE 中,以清楚地看到您遇到的问题。现在似乎有伪代码(例如,,)和未声明的类型/值(例如,,),所以我正在与代码作斗争,只是为了开始。请确保问题出在哪里是显而易见的;您的“旧解决方案”看起来与我在这里建议的相似,因此,如果有问题,您为我们阐明会很有帮助。<<===...Vec2AssetObject

答:

0赞 laoguang 11/23/2023 #1

我终于找到了这个问题的答案,就是这样

type Traits_Constructor<T> = T extends Function ? Function : (Function & { prototype: T });

并直接使用这个特性,然后问题 sloved!

GetComponent<T extends Component>(type: Traits_Constructor<T>): T;