#typescript #typescript-generics
Вопрос:
У меня есть несколько функций, которые вызывают друг друга:
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"]);
})
Можно ли ввести это таким образом, чтобы c
аргумент setConfig
был общим (зависит от фактического объекта конфигурации), а затем автоматически определить тип config
аргумента myCallback
?
Я уже пытался включить добавление прослушивателя событий в setCallback
функцию, чтобы я мог использовать универсальный тип для setConfig
, я хотел бы сделать это в другом месте , а также иметь возможность изменять config
, но при этом сохранять вывод типа.
Комментарии:
1. Какого типа
items
они должны быть? Какой типgetData()
возвращает значение?2. Подходит ли это для ваших нужд? Если да, я напишу ответ; если нет, пожалуйста, расскажите подробнее о том, что отсутствует или не работает.
Ответ №1:
Ключом к тому, чтобы это сработало, является оператор keyof Typescript:
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;
}
Комментарии:
1. Кроме того, обратите внимание, что я добавил это
items
свойство при переопределенииconfig
объекта вsetConfig