相关疑难解决方法(0)

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

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

(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

typescript

9
推荐指数
1
解决办法
1070
查看次数

TypeScript 可选属性不接受未定义的值

<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

2
推荐指数
1
解决办法
1680
查看次数