打字稿:可选字段与未定义的联合有什么区别?

Sho*_*orn 9 typescript

我想定义一个带有可选字段的接口.我认为以下是同义词.

(A):

interface State {
  userDetails: undefined | string | DataStructure | Error;
}
Run Code Online (Sandbox Code Playgroud)

(B):

interface State {
  userDetails?: string | DataStructure | Error;
}
Run Code Online (Sandbox Code Playgroud)

但是当我初始化状态时,(A)强制我将字段显式设置为undefined,如下所示:

static readonly initialAppState: AppState = {
  userDetails: undefined
};
Run Code Online (Sandbox Code Playgroud)

但是(B)我可以完全省略该字段:

static readonly initialAppState: AppState = { };
Run Code Online (Sandbox Code Playgroud)

如果我在使用定义时试图省略该字段,(A)那么会不会抱怨说:

Property 'userDetails' is missing in type
Run Code Online (Sandbox Code Playgroud)

为什么在使用定义时必须明确设置字段(A)?在初始化时强制这种不同要求的两个定义之间有什么区别?

Typesript版本:2.3.4

Sam*_*eff 11

即使在运行时,具有未定义值的键与不存在的键之间也存在差异.TypeScript允许区分并不奇怪.

试试这个:

Object.keys({a: undefined});
Run Code Online (Sandbox Code Playgroud)

如果a省略并设置它的值是undefined相同的东西那么我们期望上面返回一个空数组,但实际上它返回

[ 'a' ]
Run Code Online (Sandbox Code Playgroud)