gpt4 book ai didi

typescript - 具有对象或函数的联合类型未正确检查函数签名

转载 作者:搜寻专家 更新时间:2023-10-30 21:08:02 25 4
gpt4 key购买 nike

当我定义了 TransitionDefinition 接口(interface)时,为什么我没有收到编译器错误:

export interface State {
name: string
}

export type StateResolveFunc = (fsm: string) => State[]

export interface TransitionDefinition {
from: State | State[] | StateResolveFunc
}

然后创建一个对象,如:

const t0: TransitionDefinition = {
from: (fsm) => 'startState' // Why do I not get a compiler error?
}

我不应该被允许在这里返回一个字符串!当我只有函数类型而不是联合时,编译器会按预期报错。

Typescript example使用 typescript 3.1.1

最佳答案

所以这种行为背后的原因是所有函数都有一个 name 属性。因此,任何 函数都可以分配给 State

由于您可能不希望将任何可调用的东西分配给 State,您可以通过包含一个可选的 apply 字段来确保函数不可分配给它从不。所以像这样:

interface State {
name: string;
apply?: never; // Ensures functions are not assignable to this interface.
}

这是可行的,因为所有函数都有一个apply 方法,但该方法的类型不是never,这意味着它不能分配给状态。同样的技巧可以用于任何常见的函数属性,例如 callbind,代替 apply

无论如何,使用这个技巧,您的代码段:

export interface State {
name: string;
apply?: never;
}

export type StateResolveFunc = (fsm: string) => State[]

export interface TransitionDefinition {
from: State | State[] | StateResolveFunc
}

const t0: TransitionDefinition = {
from: (fsm) => 'startState' // Now produces an error
}

现在创建一个错误:

Type 'string' is not assignable to type 'State[]'.

关于typescript - 具有对象或函数的联合类型未正确检查函数签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52708997/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com