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来约束(或确保)状态类的正确实现。我已经为此贴了一封邮件。任何建议都会有帮助,谢谢。