Должны ли сопоставленные типы TypeScript иметь значение для каждого ключа?

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

Я бы не ожидал, что это будет так, поскольку для этого потребовалось бы неизмеримо много значений. Однако тогда я бы ожидал, что 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, который вместо этого делает ключи необязательными?


person ThomasdH    schedule 12.06.2019    source источник


Ответы (1)


Ваш код работает со строгой нулевой проверкой, потому что вы можете затем присвоить 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!
person Fenton    schedule 12.06.2019