gpt4 book ai didi

typescript - 如何获取工厂方法的类属性的接口(interface)类型

转载 作者:搜寻专家 更新时间:2023-10-30 21:53:21 25 4
gpt4 key购买 nike

我的一些代码中有一个工厂方法,我不仅要传入要实例化的类类型,还要传入类中属性的一组默认值。我希望获得类型,这样编译器会告诉我是否尝试传入正在实例化的类类型中不存在的属性。不过我不知道该怎么做。

这是一个简单的例子,展示了我想做什么。

当我尝试它时,我得到一个编译器错误:“一个接口(interface)只能扩展一个类或另一个接口(interface)。”对于接口(interface) ClassProps 因为它不能从 T 扩展。

class Base {
myId: number;
}

class Klass1 extends Base {
myString: string;
myNumber: number;
}

interface IBaseCtr<T> {
new (): T;
}

// Get an interface that is the properties of the class passed
interface ClassProps<T extends Base> extends T {}

// This method compiles, but doesn't check the prop names
//function factory<T extends Base>(ctrFunc: IBaseCtr<T>,
// initialData?: Object): T

function factory<T extends Base>(ctrFunc: IBaseCtr<T>,
initialData?: ClassProps<T>): T
{
let new_obj = new ctrFunc();
Object.assign(new_obj, initialData);
return new_obj;
}


let v1 = factory(Klass1, {myId: 10, myString: 'foo'});

let v2 = factory(Klass1, {badVar: 10});

有什么想法可以输入 initialData 以便在第二次调用中将 badVar 标记为不允许吗?

最佳答案

我认为这是一个可爱的问题。

这是我的方法。完全删除该接口(interface)。

function factory<T extends V, V extends Base>(ctrFunc: IBaseCtr<T>,
initialData?: V): T
{
let new_obj = new ctrFunc();
Object.assign(new_obj, initialData);
return new_obj;
}

这建立了一个层次结构,Base 是 V 中属性的一个子集,它本身是 T(您的最终类型)中属性的一个子集。 v1 的分配没有错误。 v2 的赋值语句导致编译时出错。

您实际上可以继续并删除 extends Base 部分,以使此功能适用于更多地方。它仍然会以相同的方式进行类型检查。

傻笑,一个完全独立的工厂函数签名,类型检查正确:

function factory<T extends V, V>(ctrFunc: new () => T,
initialData?: V): T

关于typescript - 如何获取工厂方法的类属性的接口(interface)类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37144942/

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