【发布时间】:2022-01-04 16:36:49
【问题描述】:
在工厂使用了几次之后,我很难保持动态生成的类型(通过泛型)。比文字更能说明问题的例子:Typescript Playground
type ModularData = {};
//A module just hold data
type Module<D extends ModularData> = {
data: D;
};
function moduleFactory<D>(data: D): Module<D> {
return { data };
}
//Here this is perfect, each variable has clear types
const mod1 = moduleFactory({ ref: 0 });
const mod2 = moduleFactory({ otherRef: 123 });
type ComposedModule<C> = Module<C>[];
//Product is composed of multiple modules
type Product<C> = {
modules: ComposedModule<C>;
};
function productFactory<C>(modulesList: ComposedModule<C>): Product<C> {
return {
modules: modulesList,
};
}
// This should not fire an error and hover on final should list all ModularData that compose the final Product
const final = productFactory([mod1, mod2]);
// I want to be able to see autocompletion here and not fire any errors
final.modules[0].data.ref = 3;
final.modules[1].data.otherRef = 5;
请注意,模块中的数据可以是任何东西。我尝试了很多东西,我找不到解决办法。
谢谢!
【问题讨论】:
-
请始终将您的代码包含在问题中
-
那是因为您使用单个泛型类型
C键入了ComposedModule,所以一旦从函数调用中推断出C,modulesList参数应该只是该类型,但是它在数组中找到其他类型 -
我可以稍后留下更详细的答案,但我会说问题在这里
type ComposedModule<C> = Module<C>[];你说数组中的所有模块都具有相同的类型,而不是允许它是具有不同类型的元组。您需要使用泛型来引用整个元组的类型,而不是数据属性的类型。
标签: typescript typescript-typings typescript-generics