Typescript 什么';这个签名怎么了?(打字稿-2.5)

Typescript 什么';这个签名怎么了?(打字稿-2.5),typescript,Typescript,我有一个接口 export interface ITypeAssertions { isOfTypeElseFail<TExpected extends TActual, TActual>(value: TActual, oxIsOfType: (xVal: TActual) => boolean): value is TExpected; } 导出接口ITypeAssertions { isOfTypeElseFail(值:TActual

我有一个接口

export interface ITypeAssertions
    {
         isOfTypeElseFail<TExpected extends TActual, TActual>(value: TActual, oxIsOfType: (xVal: TActual) => boolean): value is TExpected; 
    }
导出接口ITypeAssertions
{
isOfTypeElseFail(值:TActual,OxiSoftType:(xVal:TActual)=>布尔值):值是预期值;
}
和实施

export class NodeJsTestingFrameworkAdapter implements ITypeAssertions
{
  isOfTypeElseFail<TExpected extends TActual, TActual>(value: TActual, oxIsOfType: (xVal: TActual) => boolean): value is TExpected
  {
       throw new Error("Method not implemented.");
  }
}
导出类NodeJsTestingFrameworkAdapter实现ITypeAssertions
{
isOfTypeElseFail(值:TActual,OxiSoftType:(xVal:TActual)=>布尔值):值是预期值
{
抛出新错误(“方法未实现”);
}
}
编译器抱怨说:

  • 接口未正确实现

    • (……)

      • 类型谓词“value is TActual”不可赋值给“value is” t预期'
        • 类型“TActual”不可分配给类型“TExpected”
怎么了?这是类型检查器中的错误吗


PS.在Ts-2.3下编译很好。

您必须小心地将
接口(而不是接口方法)和
类(而不是接口实现方法)定义为通用:

interface ITypeAssertions<TActual, TExpected extends TActual> 
{
    isOfTypeElseFail(value: TActual, oxIsOfType: (xVal: TActual) => boolean): value is TExpected; 
}

export class NodeJsTestingFrameworkAdapter<TActual, TExpected extends TActual> implements ITypeAssertions<TActual, TExpected> 
{
    isOfTypeElseFail (value: TActual, oxIsOfType: (xVal: TActual) => boolean): value is TExpected
    {
        return true;
    }
}
接口ITypeAssertions
{
isOfTypeElseFail(值:TActual,OxiSoftType:(xVal:TActual)=>布尔值):值是预期值;
}
导出类NodeJsTestingFrameworkAdapter实现ITypeAssertions
{
isOfTypeElseFail(值:TActual,OxiSoftType:(xVal:TActual)=>布尔值):值是预期值
{
返回true;
}
}
这是在计算机上编译的


不幸的是,根据您的评论,这不是您想要的,因为它迫使您使用每一对类型实现该类。

目前没有机会让它工作,正如github.com/Microsoft/TypeScript/issues/18202下的响应中所述。

我猜您确实希望返回值是一个类型保护,如果我把它改成return bool,它就可以工作了me@TitianCernicova-Dragomir,但是将返回值从
值is T
更改为
bool
会使它不像OP希望的那样成为泛型类型保护,是吗?版本2.4引入了更严格的泛型类型推断,这可能会导致问题。不幸的是,我很难确切地理解为什么会发生这种情况。更奇怪的是,它在没有用户定义的类型保护的情况下工作。我建议将问题提交到正式的TypeScript存储库中。谢谢你的提示。它已注册为,但问题是我不希望整个类型被参数化;这将导致我为我想要测试的每种类型的对象实现接口。我需要(tester:ITypeAssertions=…),(tester:ITypeAssertions=…)等等,正如我所提到的,它确实用于Ts-2.3。事实上,这确实让我有点放心。我努力去理解它是如何在没有一些“过于松散”的编译检查的情况下工作的+1获取语言直接回购的最终答案。