Ввод вложенного массива объектов - PullRequest
1 голос
/ 27 апреля 2020

Как я могу определить foo, чтобы мне не нужно было указывать as Constraint для каждого элемента массива?

type Constraint = {
    constraint: 'required' | 'equal'
}


function bar<K extends string>(d: Record<K, Constraint[]>) {
    return Object.keys(d).reduce((a, b) => (a[b] = '', a),
                                 {} as { [key: string]: string }) as Record<K, string>
}

const foo = { apple: [ { constraint: 'required' } ] }
// Error  Type 'string' is not assignable to type '"required" | "equal"'.
const baz = bar(foo)


// Works fine
const foo2 = { apple: [  { constraint: 'required' } as Constraint ] }
const baz2 = bar(foo2)

1 Ответ

3 голосов
/ 27 апреля 2020

Когда вы вводите строку, TS распознает ее как простой string, а не как литерал 'required'. Вы можете:

  1. Использовать литерал объекта непосредственно в вызове функции:
const baz = bar({ apple: [ { constraint: 'required' } ] })

Этот способ вывода сохраняется

Объявите строку as const, то есть:
const foo = { apple: [ { constraint: 'required' as const } ] }

Это дает понять, что вы не имеете в виду обобщенную c строку, а именно тот литерал, который вы ввели. В более старой версии TS as const нет, но вы все еще можете использовать 'required' as 'required'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...