我目前正在努力打字,以便输入我的配置,整个应用程序都在使用它.配置的类型是配置,它使用键值保存在对象中.通过使用助手函数,我定义了函数参数的类型.
// Base object types
export type Config<D> = {
fn: ({ option }: { option: D }) => any;
option: D;
};
export type ConfigRecord<T extends Record<keyof T, any>> = {
[K in keyof T]: Config<T[K]> & { type: K };
};
// Helper function to type function argument
export const typeConfigRecord = <T extends Record<keyof T, any>>(
map: ConfigRecord<T>
) => map;
// Actual implementation of type
const configRecord = typeConfigRecord({
test: {
type: "test",
fn: ({ option }) => {
return option;
},
option: "test",
},
test2: {
type: "test2",
fn: ({ option }) => {
return option;
},
option: 2,
},
});
现在,使用以下方法调用配置可以正常工作,并且可以正确推断参数类型:
configRecord.test.fn({ option: "test" });
但是,当我按如下方式动态执行函数而不是UNION时,函数参数变成所有可能值的交集,导致它出错:
const dynamicExecute = (type: keyof typeof configRecord) => {
const config = configRecord[type];
return config.fn({ option: config.option }); // Error, type is never
}
我已经研究并看到了术语关联联合,我试图找出哪里出了问题,但我在想,因为它是一个嵌套属性,所以它让我绊倒了.任何建议都将不胜感激.