TypeScript中多个函数中的一个泛型类型



我有多个相互调用的函数:

let config;
let callback;
function setConfig(c) {
config = {};
for(const i of c.items) config.items[i] = getData(i);
return {
setCallback: (cb) => { callback = cb; }
};
}
x.addEventListener("someEvent", () => callback(config));
// usage
setConfig({items: ["a", "b", "c"]}).setCallback(function myCallback(config) {
console.log(config.items["a"]);
console.log(config.items["b"]);
console.log(config.items["c"]);
})

是否可以以setConfigc参数是通用的(取决于实际的配置对象(的方式键入它,然后自动推断myCallbackconfig参数的类型?

我已经尝试过在setCallback函数中添加事件侦听器,这样我就可以为setConfig携带一个泛型类型,我想在另一个地方这样做,也可以修改config,但仍然保留类型推断。

使其工作的关键是Typescript的keyof运算符:

interface Config<ConfigItems extends object> {
items: ConfigItems;
}
type ConfigCallback<ConfigItems extends object> = (
config: Config<ConfigItems>
) => void;
function setConfig<ConfigItems extends object>(c: {
items: (keyof ConfigItems)[];
}) {
config = {
items: {},
};
for (const i of c.items) config.items[i] = getData(i);
return {
setCallback: (cb: ConfigCallback<ConfigItems>) => {
callback = cb;
},
};
}

现在,myCallback的配置参数将推断为:

Config<{
a: any;
b: any;
c: any;
}

最新更新