为什么只有对象需要`satisfies`而不是简单类型?

问题描述 投票:0回答:1

我不应该得到同样的错误吗?同样的情况,将函数分配给

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

TS Playground 链接

typescript
1个回答
0
投票

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 属性是并集),因此不会发生赋值缩小。

    

© www.soinside.com 2019 - 2024. All rights reserved.