Typescript实用程序类型,使属性成为可选属性,但未将值设置为未定义的并集

时间:2020-03-29 01:34:51

标签: typescript type-systems

实用程序类型Partial<>不仅将类型的键设置为可选,还将它们的值设置为具有未定义的并集:

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

是否存在会导致{ foo?: number }

的实用程序类型?

1 个答案:

答案 0 :(得分:1)

简短回答

是否存在会导致{ 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的对象不同。在下面,控制台为obj1obj2输出不同的内容。

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

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

那么类型系统是否“错误”?应该有一种说法:“该属性必须是数字或什么都没有……甚至没有定义。”可能是,可能不是;确保答案充满复杂性。

JavaScript是一种有很多疣的语言,TypeScript尽其所能以静态类型表示它-疣和所有疣。结果类型系统不是“声音” nor does it try to be