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
使用赋值链接时会发生什么情况?如何解决此类型错误?
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
使用赋值链接时会发生什么情况?如何解决此类型错误?
让我们从第一个 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
)
为了修复第一种情况,必须同时声明a
和b
到{ m?: string }
.
type Foo = {
m?: string;
}
let a: Foo;
let b: Foo = a = {}
playground link