Тип пригодности Typescript, который делает свойство необязательным, но не устанавливает значение для объединения с неопределенным - PullRequest
1 голос
/ 29 марта 2020

Тип утилиты Partial<> не только устанавливает ключи типа на необязательные, но и их значения в объединение с неопределенным:

type Obj = { foo: number }
type PartialObj = Partial<Obj> // { foo?: number | undefined }

Существует ли тип утилиты, который вместо этого приведет к : { foo?: number }

1 Ответ

1 голос
/ 29 марта 2020

Краткий ответ

Существует ли тип утилиты, который вместо этого приведет к: { foo?: number }?

Тип утилиты для этого не существует.

Почему? TypeScript видит { foo?: number } и { foo?: number | undefined } как один и тот же тип.

Некоторое исследование

Вот результат наведения в VS Code, который показывает, что оба типа имеют одинаковый результат.

enter image description here

В некотором смысле это имеет смысл, поскольку несуществующее свойство равно undefined. Здесь obj1 не имеет свойства foo, и все же свойство foo имеет тройное значение, равное undefined.

const obj1 = {};
const obj2 = {
  foo: undefined
};

console.log(obj1.foo === undefined);
console.log(obj2.foo === undefined);

Тем не менее, объект с несуществующим свойством действительно отличается от объекта с этим свойством, установленным на undefined. Далее консоль выводит что-то другое для obj1 и obj2.

const obj1 = {};
const obj2 = {
  foo: undefined
};

console.log(obj1);
console.log(obj2);

Так это система типов "неправильная"? Должен ли быть способ сказать: «Свойство должно быть числом или ничем вообще ... даже не определенным». Может быть да, а может быть и нет; убедитесь, что ответ полон сложностей.

JavaScript - это язык с множеством бородавок, и TypeScript делает все возможное, чтобы представить его - бородавки и все - в стати c типах. Результирующая система типов не является "звуковой", и не пытается быть .

...