В приведенном ниже коде, если я не укажу T
явно при вызове функции, например getOrPut<Item>(...)
, это выводится из параметра create
, в результате созданный тип элемента может быть несовместим со словарем obj
, см. последнюю строку кода для пример.
function getOrPut<T>(
obj: { [key: string]: T | undefined },
key: string,
create: () => T
): T {
const value = obj[key];
if (value) {
return value;
} else {
return obj[key] = create();
}
};
type Item = { title: string };
type Dictionary = { [key: string]: Item };
const dictionary: Dictionary = {};
// the foo type is {} but I expect Item
const foo = getOrPut(dictionary, 'foo', () => ({}));
Можно ли заставить T
выводиться из параметра obj
?
getOrPut
это служебная функция, я хочу максимально упростить ее использование. В некоторых случаях тип элемента может быть сложным, например{ [key: string]: { title: string } }
или{ [key: string]: Omit<Item, 'foo'> }
. Неудобно указывать такой сложный тип при каждом вызове функции. - person Valeriy Katkov   schedule 19.11.2019