TypeScript函数泛型只能用于具有多个签名的函数重载

TypeScript函数泛型只能用于具有多个签名的函数重载,typescript,generics,overloading,Typescript,Generics,Overloading,我正在使用通用函数定义一个接口,如: export interface IState { send: <I, E>(message: I, callback?: (e: E) => void) => IState; } 但是,当我想定义一个只有一个发送签名的IState时, 我遇到了编译错误: class CountState implements IState { constructor(public readonly data: number) {} /

我正在使用通用函数定义一个接口,如:

export interface IState {
  send: <I, E>(message: I, callback?: (e: E) => void) => IState;
}
但是,当我想定义一个只有一个发送签名的IState时, 我遇到了编译错误:

class CountState implements IState {
  constructor(public readonly data: number) {}
  // send(m: 'inc', cb?: (e: number) => void): CountState;
  // send(m: 'inc', cb?: (e: number) => void): CountState;
  send(m: 'inc', cb?: (e: number) => void): CountState {
    const result = this.data + 1;
    if (cb !== undefined) {
      cb(result);
    }
    return new CountState(this.data + 1);
  }
}
发送方法出错:

类型“CountState”中的属性“send”不可分配给相同的 基类型“IState”中的属性。类型(m:“公司”,cb:((e:编号) =>void)|未定义)=>CountState'不可分配给type'(消息:I,回调?:((e:e)=>void)|未定义)=>IState'。 参数“m”和“message”的类型不兼容。 类型“I”不可分配给类型“inc”。ts(2416)

如果我加上这两行注释

class CountState implements IState {
  constructor(public readonly data: number) {}
  send(m: 'inc', cb?: (e: number) => void): CountState;
  send(m: 'inc', cb?: (e: number) => void): CountState;
  send(m: 'inc', cb?: (e: number) => void): CountState {
    const result = this.data + 1;
    if (cb !== undefined) {
      cb(result);
    }
    return new CountState(this.data + 1);
  }
}

它编译得很好,但看起来真的很奇怪。如何修复此问题?

我同意Titian Cernicova Dragomir的观点,即这似乎是一个编译器错误。 IState的定义基本上说明了“send”属性是一个可以用“message”的任何类型调用的函数,回调参数“e”也可以有任何类型

export interface IState {
    send: <I, E>(message: I, callback?: (e: E) => void) => IState;
}
查看您包含的测试代码,您正在检查未知“Both”类型的确切类型,因此,即使您只在类中为每个操作定义了左、右不同的方法,似乎也不会丢失任何功能。情商:

class Left {
    turnRight(...) {
        return new Right();
    }
    keepGoin(...) {
        return new Left();
    }
}

与对每个操作使用通用的“send”方法相反。

我同意提香·塞尔尼科娃·德拉戈米尔(Titian Cernicova Dragomir)的观点,这似乎是一个编译器错误。 IState的定义基本上说明了“send”属性是一个可以用“message”的任何类型调用的函数,回调参数“e”也可以有任何类型

export interface IState {
    send: <I, E>(message: I, callback?: (e: E) => void) => IState;
}
查看您包含的测试代码,您正在检查未知“Both”类型的确切类型,因此,即使您只在类中为每个操作定义了左、右不同的方法,似乎也不会丢失任何功能。情商:

class Left {
    turnRight(...) {
        return new Right();
    }
    keepGoin(...) {
        return new Left();
    }
}

与对每个操作使用通用的“send”方法不同。

我很惊讶它在重载情况下能工作。泛型函数不应从实现特定类型参数集签名的泛型函数进行赋值。我想说这是一个编译器错误。为此,请与@TitianCernicova Dragomir's交叉链接。谢谢您的评论。我现在明白我的错误了。然后是如何表示有限状态机状态的抽象。这是一个正确的问题吗?有什么解决办法吗?我很惊讶它能在过载的情况下工作。泛型函数不应从实现特定类型参数集签名的泛型函数进行赋值。我想说这是一个编译器错误。为此,请与@TitianCernicova Dragomir's交叉链接。谢谢您的评论。我现在明白我的错误了。然后是如何表示有限状态机状态的抽象。这是一个正确的问题吗?有什么解决办法吗?谢谢你的回答,我知道混合重载和泛型现在是错误的。在没有实现IState接口的情况下定义类是可行的,但我想要的正是使用IState来约束(或确保)状态类的正确实现。我已经为此贴了一封邮件。任何建议都会很有帮助,谢谢。谢谢你的回复,我理解现在混合重载和泛型是错误的。在没有实现IState接口的情况下定义类是可行的,但我想要的正是使用IState来约束(或确保)状态类的正确实现。我已经为此贴了一封邮件。任何建议都会有帮助,谢谢。