let a: {
    m?: string
};

let b = a = {};

b.m = ''; // Property 'm' does not exist on type '{}'.


let a: {
    m?: string
} = {};

let b = a;

b.m = ''; // It's OK

Playground link

使用赋值链接时会发生什么情况?如何解决此类型错误?

推荐答案

让我们从第一个 case 开始:

let a: {
  m?: string
};

let b = a = {};

b的类型不是从a推断出来的,而是从{}推断出来的,这就是为什么你不能从b访问m.

在第二种情况下

let a: {
    m?: string
} = {};

let b = a;

b的类型是从具有m属性的a推断出来的.

为什么是这个?

请看下面的例子

let x = y = z;

y = z会得到z,这是因为赋值实际上是一个表达式.

因此,类型脚本判断z的类型(在本例中为{}),并将其分配给x(在本例中为b)

为了修复第一种情况,必须同时声明ab{ m?: string }.

type Foo = {
    m?: string;
}

let a: Foo;

let b: Foo = a = {}

playground link

Javascript相关问答推荐

Next.js Next/Image图像隐含性有任何类型-如何修复?

有Angular 的material .未应用收件箱中的价值变化

*ngFor和@代表输入decorator 和选角闭合

if/else JavaScript中的条件行为

将现场录音发送到后端

如何在coCos2d-x中更正此错误

try 使用javascript隐藏下拉 Select

用JS从平面文件构建树形 struct 的JSON

使用js构造一个html<;ath&>元素并不能使其正确呈现

如何在Node.js中排除导出的JS文件

在画布中调整边上反弹框的大小失败

如何在FastAPI中为通过file:/URL加载的本地HTML文件启用CORS?

Google脚本数组映射函数横向输出

如何在和IF语句中使用||和&;&;?

使用自动识别发出信号(&Q)

使用RxJS from Event和@ViewChild vs KeyUp事件和RxJS主题更改输入字段值

使用Perl Selify::Remote::Driver执行Java脚本时出错

更新文本区域行号

Playwright:ReferenceError:browserContext未定义

Html/JS:如何在脚本执行前阻止呈现?