Краткий ответ
Существует ли тип утилиты, который вместо этого приведет к: { foo?: number }
?
Тип утилиты для этого не существует.
Почему? TypeScript видит { foo?: number }
и { foo?: number | undefined }
как один и тот же тип.
Некоторое исследование
Вот результат наведения в VS Code, который показывает, что оба типа имеют одинаковый результат.
В некотором смысле это имеет смысл, поскольку несуществующее свойство равно 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 типах. Результирующая система типов не является "звуковой", и не пытается быть .