Почему Typescript не может использовать keyof типа generi c в назначении и обобщать его на строку? - PullRequest
2 голосов
/ 01 августа 2020

Я столкнулся с любопытной ошибкой присвоения Typescript и пытаюсь понять, почему это не работает. Для справки я использую TS 3.9.2.

Код:

function test<U extends object>(a: U, k: keyof U) {
    const x: Partial<U> = { [k]: a[k] };
    // ...
}

Ошибка:

Type '{ [x: string]: U[keyof U]; }' is not assignable to type 'Partial<U>'.

Проблема возникает только тогда, когда я используя дженерики, например, если вместо U я использую конкретный интерфейс, он работает должным образом.

Я предполагаю, что система типов не может правильно вывести ключи U и используйте их во время задания, почему? Я проверяю тип k внутри { [k]: a[k] }, он правильно возвращает keyof U, поэтому я не полностью понимаю, почему система типов не может использовать эту информацию, чтобы проверить, законно ли присвоение, и обобщить k до string.

Спасибо.

1 Ответ

0 голосов
/ 01 августа 2020

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

В этом случае лучше скажите компилятору, что теперь у вас есть Частичный исходный объект вроде этого

function test<U>(a: U, k: keyof U) {
    const x: Partial<U> = { [k]: a[k] } as Partial<U>;

    return x;
}

, и он будет работать

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