interface SomeType {
a: string;
b?: string;
}
const foo: SomeType = {
a: 'hello',
b: 'there'
};
const bar: SomeType = {
a: 'hello'
};
bar.b = 'there';
// Error on this line
const str: string = foo.b;
// These lines have no error
const str2: string = foo.b ? foo.b : '';
const str3: string = foo.b!;
const str4: string = bar.b;
在上面的例子中,我们有两种创建SomeType
对象的方式,SomeType
有一个可选的属性b
。当声明foo
时,我们在创建对象时设置b
的值。对于bar
,我们在创建对象后设置b
的值。
创建第一个字符串str
时,出现错误:
类型'字符串|“未定义”不能赋值给类型“string”。类型“未定义”不能赋值给类型“string”。ts(2322)
这个错误可以通过str2
和str3
的方法来减轻。我知道在这些例子中,我们要么检查foo.b
的值,要么Assert我们知道foo.b
有一个值。
我不明白为什么创建str4
时没有出现错误。为什么TypeScript能够检测到bar.b
不是undefined
,但不能检测到foo.b
的相同情况?我们设置属性的方式导致了此错误?
(类型脚本版本3.8.2)
2条答案
按热度按时间23c0lvtd1#
从
const foo: SomeType = ...
行中删除SomeType
将使代码工作。在原始代码中,您将对象
{ a:..., b:...}
转换为interface
。在本例中,SomeType
:最简单的例子是,如果修改
str4
的最后一行以添加强制转换,则会产生相同的错误:pxq42qpu2#
如果在
tsconfig.json
文件中的angularCompilerOptions
中启用strictTemplates
,则几乎所有组件都可能出现此错误。从Angular 9开始,我们有了这个新特性,称为strictTemplates。
这确实是一个很好的特性,但是,如果您没有足够的时间来修复所有这些错误,您可以将其设置为false,例如,当您有一个重要的版本时。
有一个很好的blog post可以更好地解释这一点。