Чтобы облегчить проверку типов после возврата данных из универсальной функции, я пытаюсь настроить ее так, чтобы возвращаемый объект имел только идентификаторы элементов, которые я передал функции. Однако я не могу понять, как правильно инициализировать возвращаемый объект.
Я могу использовать просто {}, если сделаю свойства необязательными, но все они вернутся, а я не хочу этого делать. Когда я использую цикл for, TS доволен. Но почти такой же подход к инициализации "newObj" не работает, так как он обрабатывает свойство как просто строку, а не T в этом контексте. Что мне не хватает? Какой подход мог бы работать здесь, не делая необязательным [Property in T]?
Итак, пока я пытаюсь заставить TS показывать возвращаемый тип: <{item1: логическое значение; элемент2: логическое значение; item3: логическое значение;}>
Я могу получить только это без ошибок: <{item1?: логическое значение | неопределенный; элемент2?: логическое значение | неопределенный; item3?: логическое значение | не определено;}>
Спасибо за любую помощь!
const testObj = [
{ itemID: 'item1', val: 34 },
{ itemID: 'item2', val: 45 },
{ itemID: 'item3', val: 200 },
] as const;
testChoices(testObj);
export function testChoices<T extends string>(items: readonly { itemID: T; val: number }[]) {
const newObj: { [Property in T]: boolean } = { [items[0].itemID]: items[0].val > 100 } ;
// TS error: Type '{ [x: string]: boolean; }' is not assignable to type '{ [Property in T]: boolean; }'
for (const item of items) {
newObj[item.itemID] = item.val > 100; // ok
}
return newObj;
}```
Подойдет ли вам
const newObj = { } as { [Property in T]: boolean };
?вычисляемое свойство всегда выводится как
{[prop:string]:any type}
@NadiaChibrikova Это утверждение типа идеально, спасибо! Я согласен с тем, что функция не помечает некоторые ошибки, поскольку я знаю, что я прав, и где мне нужна помощь, так это в использовании функции извне.