typescript 2.3或2.4中的泛型重载已损坏

typescript 2.3或2.4中的泛型重载已损坏,typescript,Typescript,以下示例在从typescript 2.2升级时中断 interface ILayoutResult { id: string; data: any; } interface ILayout{ getResult<T extends ILayoutResult | ILayoutResult[] | void>() :T; } class test implements ILayout{ getResult(){ return {id:"

以下示例在从typescript 2.2升级时中断

interface ILayoutResult {
    id: string;
    data: any;
}
interface ILayout{
    getResult<T extends ILayoutResult | ILayoutResult[] | void>() :T;
}

class test implements ILayout{
    getResult(){
       return {id:"a", data:"aa"} as ILayoutResult ;
    }
}


Types of property 'getResult' are incompatible.
    Type '() => ILayoutResult' is not assignable to type '<T extends void | ILayoutResult | ILayoutResult[]>() => T'.
      Type 'ILayoutResult' is not assignable to type 'T'.
接口结果{
id:字符串;
资料:有;
}
接口ILayout{
getResult():T;
}
类测试实现ILayout{
getResult(){
返回{id:“a”,数据:“aa”}作为结果;
}
}
属性“getResult”的类型不兼容。
类型“()=>ILayoutResult”不可分配给类型“()=>T”。
类型“ILayoutResult”不可分配给类型“T”。

这是一个正确的错误。
ILayout
的定义是这样做是合法的:

const x: ILayout = ...;
const arr = x.getResult<ILayoutResult[]>();
const j = arr.pop();

我也得出了这个结论。不知何故,我采用了这种方式来添加通用模板,比如在调用getResult时,我可以很容易地知道我想要什么类型。但是正确的方法是将getResult()作为ILayoutResult
interface ILayout {
    getResult(): ILayoutResult | ILayoutResult[] | void;
}