我不应该得到同样的错误吗?同样的情况,将函数分配给
number | Function
类型并调用它:
type Treta = {
name: string,
stuff: number | Function
}
const obj1 = {
name: "Paulo",
stuff: () => {}
} satisfies Treta;
obj1.stuff() // No error!
const obj2: Treta = {
name: "Paulo",
stuff: () => {}
};
obj2.stuff();
// ^^^^ ERROR: No constituent of type 'number | Function' is callable.
type Other = number | Function;
const obj3 : Other = () => {};
obj3(); // No error even without satisfies
在
const obj1 = {
name: "Paulo",
stuff: () => {}
} satisfies Treta;
obj1.stuff() // okay
satisfies
运算符,它不会将表达式的类型扩展到 Treta
,它只是检查表达式是否可分配给它。所以 obj1
是 {name: string, stuff: () => void}
类型,并且 stuff
已知是可调用的。
在
const obj2: Treta = {
name: "Paulo",
stuff: () => {}
};
obj2.stuff(); // error!
您已将 ob2
的类型
注释为
Treta
,这是单个对象类型。因此,ob2
一直扩大到Treta
,并且在初始化对象中找到的任何更具体的信息都被丢弃。因此 obj2
属于 Treta
类型,并且其 stuff
属性not 已知可调用。
在
type Other = number | Function;
const obj3: Other = () => {};
obj3(); // okay
您已将
obj3
注释为 联合类型。在这种情况下,当您为其分配一个值时,您会得到分配缩小,其中obj3
缩小为仅与分配的值兼容的联合成员。在本例中,它是 Function
,因此当您调用它时,obj3
会被视为类型 Function
,这样就可以了。
请注意,当您分配给“union”类型的变量时,“仅”会发生赋值缩小。 Treta
不是并集(尽管它的 stuff
属性是并集),因此不会发生赋值缩小。