如何在TypeScript中正确创建泛型方法?

时间:2017-10-31 06:24:28

标签: typescript generics

我有一个抽象类:

abstract class TableAdapter {
    public abstract convertInputToOutput<InputType, OutputType> (apiRow: InputType): OutputType;
}

现在我将从它继承一组类:

class TableAdapter1 extends TableAdapter {

    public convertInputToOutput (apiRow: InputType1): OutputType1 {
        // return something of type OutputType1;
    }
}

class TableAdapter2 extends TableAdapter {

    public convertInputToOutput (apiRow: InputType2): OutputType2 {
        // return something of type OutputType2;
    }
}

我在编译时看到错误:

  

参数类型&#39; apiRow&#39;和&#39; apiRow&#39;是不相容的。   输入&#39; ApiRowType&#39;不能分配给&#39; InputType1&#39;

如何修复它并在继承类中设置确切类型,以便我可以访问对象&#39;字段?

2 个答案:

答案 0 :(得分:1)

尝试扩展泛型类,将抽象类修改为abstract class TableAdapter<InputType, OutputType>并扩展TableAdapter1,如class TableAdapter1 extends TableAdapter<InputType1, OutputType1>

abstract class TableAdapter<InputType, OutputType> {
    public abstract convertInputToOutput(apiRow: InputType): OutputType;
}

class TableAdapter1 extends TableAdapter<InputType1, OutputType1> {
    public convertInputToOutput (apiRow: InputType1): OutputType1 {
    }
}

class TableAdapter2 extends TableAdapter<InputType2, OutputType2> {
    public convertInputToOutput (apiRow: InputType2): OutputType2 {
    }
}

答案 1 :(得分:1)

关于TypeScript的一个有趣的事情是,在TypeScript中没有它们的情况下,您可能需要处理名义语言中许多需要您使用泛型的情况。

这并不是说您的具体情况可以在没有泛型的情况下完成,但值得考虑以下示例。

如果你有一个必须遵守所有输入类型和输出类型的最小接口,你可以在没有泛型的情况下实现这一点,这要归功于结构类型系统。

例如,如果您需要输入类型至少具有name,但它也可能具有其他属性,则可以在没有泛型的情况下实现此目的。例如,我们将使用几个接口,但您不一定需要这些接口 - 结构将会...输出类型也是如此。

interface InputType {
    name: string;
}

interface InputType1 extends InputType {
    location: string;
}

interface InputType2 {
    name: string;
}

将检查您的代码的结构兼容性,而无需使用泛型:

abstract class TableAdapter {
    public abstract convertInputToOutput(apiRow: InputType): OutputType;
}

class TableAdapter1 extends TableAdapter {
    public convertInputToOutput(apiRow: InputType1): OutputType1 {
        return { name: '', location: '' };
    }
}

class TableAdapter2 extends TableAdapter {
    public convertInputToOutput(apiRow: InputType2): OutputType2 {
        return { name: '' };
    }
}

如果您对输入和输出类型的确很满意,那么抽象类可以说它们很高兴any类型。