Как правильно использовать TS для возврата объекта с определенным списком свойств

avatar
Robert T
1 июля 2021 в 20:41
51
0
0

Чтобы облегчить проверку типов после возврата данных из универсальной функции, я пытаюсь настроить ее так, чтобы возвращаемый объект имел только идентификаторы элементов, которые я передал функции. Однако я не могу понять, как правильно инициализировать возвращаемый объект.

Я могу использовать просто {}, если сделаю свойства необязательными, но все они вернутся, а я не хочу этого делать. Когда я использую цикл 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;
}```
Источник
Nadia Chibrikova
1 июля 2021 в 21:01
1

Подойдет ли вам const newObj = { } as { [Property in T]: boolean };?

captain-yossarian
2 июля 2021 в 07:03
0

вычисляемое свойство всегда выводится как {[prop:string]:any type}

Robert T
2 июля 2021 в 16:30
0

@NadiaChibrikova Это утверждение типа идеально, спасибо! Я согласен с тем, что функция не помечает некоторые ошибки, поскольку я знаю, что я прав, и где мне нужна помощь, так это в использовании функции извне.

Ответы (0)