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

Ali*_*eir 2 javascript-intellisense typescript reactjs visual-studio-code

<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语句应该忽略这一点:

图像

但仍然编译得很好。

小智 6

对我来说,VSCode 使用的是 Typescript 的最新测试版,而不是我在工作区中声明的版本。

他们的新测试版本的 PR 引入了一些潜在的重大更改,这就是您看到错误的原因。 https://github.com/microsoft/TypeScript/pull/43947

它引入了一种新的严格模式——strictOptionalProperties。如果您"strict": true的 tsconfig 中有此新模式,则默认情况下启用。

有人在这里提出了一个建议,这可能有助于使这一点更加清晰。 https://github.com/microsoft/TypeScript/issues/44403

总而言之,您在 VSCode 中看到 Intellisense 问题,因为 VSCode 使用的新版本 Typescript 引入了重大更改。如果您更改 VSCode Typescript 版本以匹配您的工作区,应该没问题。