Должны ли отображаемые типы TypeScript иметь значение для каждого ключа? - PullRequest
0 голосов
/ 12 июня 2019

Мне интересно, должен ли каждый ключ в отображаемом типе иметь определенное значение.

Я бы не ожидал, что это будет так, поскольку для этого потребуется неоправданно много значений.Однако тогда я ожидал бы, что Partial<T> можно назначить для сопоставленного типа T, что не является.Кроме того, при чтении значения из сопоставленного типа проверка typeof value === 'undefined' не требуется.


type Mapped = { [key: string]: string };

// This works, so not all keys have to be defined
const mapped: Mapped = { 'a': 'b' };

// This is valid even with strict checks even though 's' is undefined
const s: string = mapped['c'];

const partialMapped: Partial<Mapped> = mapped;
// This doesn't work because `Partial<Mapped>` is of type `{ [key: string]: string | undefined }`
const secondMapped: Mapped = partialMapped;

Поскольку { 'a': 'b' } присваивается переменной Mapped, я ожидаю, что Partial<Mapped> можно назначитьна Mapped, но это не так.Это потому, что значение undefined отличается от отсутствия ключа?Есть ли в Partial вариант, который вместо этого делает ключи необязательными?

1 Ответ

0 голосов
/ 12 июня 2019

Ваш код работает со строгими проверками нуля, потому что вы можете назначить undefined значения для string. Мы говорим о значениях здесь, ключи безразличны!

Ваша подпись типа индекса для Mapped не обещает никаких конкретных ключей, поэтому назначение типа с нулевым или большим количеством ключей будет работать. Недопустимым является присвоение нестроковых значений (например, undefined и null), и это то, что подсвечивает ошибка.

Вот надуманный пример того, от чего защищает ошибка:

var undef: undefined;
const partialMapped: Partial<Mapped> = {a: undef, b: undef}; // Works

Частичная версия может принимать неопределенные значения. «Полная» версия не позволяет этого.

var undef: undefined;
const mapped: Mapped = {a: undef, b: undef}; // Warnings!
...