TypeScript:键入“字符串|“undefined "不能赋给类型”string“

juud5qan  于 2023-02-20  发布在  TypeScript
关注(0)|答案(2)|浏览(250)
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)

这个错误可以通过str2str3的方法来减轻。我知道在这些例子中,我们要么检查foo.b的值,要么Assert我们知道foo.b有一个值。
我不明白为什么创建str4时没有出现错误。为什么TypeScript能够检测到bar.b不是undefined,但不能检测到foo.b的相同情况?我们设置属性的方式导致了此错误?
(类型脚本版本3.8.2)

23c0lvtd

23c0lvtd1#

const foo: SomeType = ...行中删除SomeType将使代码工作。

interface SomeType {
  a: string;
  b?: string;
}

const foo = {
  a: 'hello',
  b: 'there'
};

const bar: SomeType = {
  a: 'hello'
};
bar.b = 'there';

// No more 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;

在原始代码中,您将对象{ a:..., b:...}转换为interface。在本例中,SomeType

const foo: SomeType = {
  a: 'hello',
  b: 'there'
};

最简单的例子是,如果修改str4的最后一行以添加强制转换,则会产生相同的错误:

const str4: string = (bar as SomeType).b; // error, because of the cast
pxq42qpu

pxq42qpu2#

如果在tsconfig.json文件中的angularCompilerOptions中启用strictTemplates,则几乎所有组件都可能出现此错误。

从Angular 9开始,我们有了这个新特性,称为strictTemplates。

"angularCompilerOptions":{
    "strictTemplates": true
  }

这确实是一个很好的特性,但是,如果您没有足够的时间来修复所有这些错误,您可以将其设置为false,例如,当您有一个重要的版本时。
有一个很好的blog post可以更好地解释这一点。

相关问题