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

时间:2017-09-25 03:41:27

标签: typescript

我想用可选字段定义一个接口。我认为以下是同义词。

(A)

interface State {
  userDetails: undefined | string | DataStructure | Error;
}

(B)

interface State {
  userDetails?: string | DataStructure | Error;
}

但是当我初始化状态时,(A)迫使我明确地将字段设置为未定义,如下所示:

static readonly initialAppState: AppState = {
  userDetails: undefined
};

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

static readonly initialAppState: AppState = { };

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

Property 'userDetails' is missing in type

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

Typesript版本:2.3.4

1 个答案:

答案 0 :(得分:10)

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

试试这个:

Object.keys({a: undefined});

如果离开a并将其值设置为undefined是相同的,那么我们希望上面的内容返回一个空数组,但实际上它会返回

[ 'a' ]