我有一个抽象类:
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;字段?
答案 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
类型。