我想用可选字段定义一个接口。我认为以下是同义词。
(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
答案 0 :(得分:10)
即使在运行时,具有未定义值的键与不存在的键之间也存在差异。 TypeScript允许区分并不奇怪。
试试这个:
Object.keys({a: undefined});
如果离开a
并将其值设置为undefined
是相同的,那么我们希望上面的内容返回一个空数组,但实际上它会返回
[ 'a' ]