我想定义一个带有可选字段的接口.我认为以下是同义词.
(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
<MyCustomField
type={props.type}
Run Code Online (Sandbox Code Playgroud)
MyCustomField 的type类型定义:
type?: string;
Run Code Online (Sandbox Code Playgroud)
props.type的类型定义:
type?: string;
Run Code Online (Sandbox Code Playgroud)
感觉就像我不小心打开了某些设置。我的 tsconfig:
<MyCustomField
type={props.type}
Run Code Online (Sandbox Code Playgroud)
编辑:此外,它编译得很好:
只是 VSCode Intellisense 不喜欢它。
编辑2:
if (!clone[index].options) throw Error(`Data at index ${index}, ${optionIndex} doesn\'t have options`);
if (type === FieldDataTypeEnum.RadioButton) {
clone[index].options.forEach(o => o.checked = false);
} else {
clone[index].options[optionIndex].checked = true;
}
Run Code Online (Sandbox Code Playgroud)
这也给了我一个错误,指出clone[index].options可能是未定义的,即使if语句应该忽略这一点:
但仍然编译得很好。
javascript-intellisense typescript reactjs visual-studio-code