我不应该得到同样的错误吗?同样的情况,将函数分配给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
在
您使用的是运算
satisfies
符,它不会将表达式的类型扩大到Treta
,它只是检查表达式是否可分配给 it。所以obj1
是 类型{name: string, stuff: () => void}
,并且stuff
已知是可调用的。在
您已注释了
ob2
to be的类型Treta
,它是单个对象类型。因此,ob2
一直扩展到Treta
,并且在初始化对象中找到的任何更具体的信息都将被丢弃。obj2
类型也是如此Treta
,并且其stuff
属性未知为可调用。在
您已注释
obj3
为联合类型。在这种情况下,当您为其分配一个值时,您会得到分配缩小,其中obj3
缩小到仅与分配的值兼容的联合成员。在本例中,它是Function
,因此当您调用它时obj3
被视为类型Function
,这很好。请注意,仅当您分配给联合类型的变量时,才会发生分配缩小。
Treta
不是联合(即使它的stuff
属性是联合),因此不会发生赋值缩小。