这个签名有什么问题? (打字稿-2.5)

时间:2017-09-01 08:58:13

标签: typescript

我有一个界面

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

和实施

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.");
  }
}

编译器抱怨说:

  • 接口 - 不正确实现的

    • (...)

      • 类型谓词'值为TActual'不能赋值为'value is TExpected'
        • 类型'TActual'不能分配给'TExpected'类型

怎么了?这是类型检查器中的错误吗?

PS。它在Ts-2.3下编译得很好。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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;
    }
}

这会在Typescript playground上进行编译。

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