gpt4 book ai didi

Typescript - 实现泛型类型的类实例

转载 作者:行者123 更新时间:2023-12-04 01:33:21 25 4
gpt4 key购买 nike

我有一个使用通用接口(interface)创建类的函数。实例的属性由该泛型的参数设置,如下所示:

const ClassFactory = <T>() => {

class MyClass {
constructor(data: T) {
for (const key in data) {
if (!data.hasOwnProperty(key)) { continue; }
(this as any)[key] = data[key];
}
}

// other methods can be here
}

return MyClass;
}

const GeneratedClass = ClassFactory<{ id: number }>();

const myInstance = new GeneratedClass({ id: 1 });

console.log((myInstance as any).id); // logs 1


这按预期运行,但是有两个问题
  • myInstance Typings 没有 T 的键 - 我期待 myInstance.id成为一个数字
  • 我必须投this as any在构造函数中通过给定数据分配值

  • 为了解决第一个问题,我尝试了从其他帖子中看到的各种方法,包括 class MyClass implements T ,但它们都导致相同的错误: A class can only implement an object type or intersection of object types with statically known members.ts(2422) .
    我明白为什么会这样,但是自从 T在定义类时已知,有没有办法让它工作?

    如果我有 public data: T 中的数据属性,然后 myInstance.data.id输入正确。所以我的问题是,这可以通过跳过 .data 来完成吗?部分?

    提前致谢

    最佳答案

    受 Jonas Wilms 评论的启发,即使类有方法/静态,我也可以通过返回

    return MyClass as (new (data: T) => T & InstanceType<typeof MyClass>) & typeof MyClass;

    像这样,以下所有内容都按预期键入和运行
    const myInstance = new GeneratedClass({ id: 1 });

    console.log(myInstance.id, GeneratedClass.someStatic(), myInstance.someMethod());

    但是,如果 new MyClass() 则无法正常工作。在类方法中使用。

    它工作的一种解决方法是创建一个静态的,它返回一个具有正确类型的实例
            // inside the class
    public static build(data: T): T & InstanceType<typeof MyClass> {
    return new MyClass(data) as T & InstanceType<typeof MyClass>;
    }

    然后以下是预期的
    const myInstance = GeneratedClass.build({ id: 1 });

    console.log(myInstance.id, GeneratedClass.someStatic(), myInstance.someMethod());

    完整的工作示例
    const ClassFactory = <T>() => {
    class MyClass {
    constructor(data: T) {
    for (const key in data) {
    if (!data.hasOwnProperty(key)) { continue; }
    (this as any)[key] = data[key];
    }
    }

    public static build(data: T): T & InstanceType<typeof MyClass> {
    return new MyClass(data) as T & InstanceType<typeof MyClass>;
    }

    public static someStatic() {
    return 2;
    }

    public someMethod() {
    return 3;
    }
    }

    return MyClass as (new (data: T) => T & InstanceType<typeof MyClass>) & typeof MyClass;
    }

    const GeneratedClass = ClassFactory<{ id: number }>();

    const myInstance = new GeneratedClass({ id: 1 });

    console.log(myInstance.id, GeneratedClass.someStatic(), myInstance.someMethod());

    const myBuiltInstance = GeneratedClass.build({ id: 1 });

    console.log(myBuiltInstance.id, GeneratedClass.someStatic(), myBuiltInstance.someMethod());

    关于Typescript - 实现泛型类型的类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60440176/

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