Reactjs 默认泛型的默认值

Reactjs 默认泛型的默认值,reactjs,typescript,inheritance,abstract-class,default,Reactjs,Typescript,Inheritance,Abstract Class,Default,考虑一个泛型类: abstract class Base<T={}> { public getSmth(): T { ... } } 您不能对t的某些值抽象方法,而对t的其他值不抽象方法(即使该值是t的默认值)。更好的解决方案是将方法抽象,如果这是常见情况,则为{}提供默认实现。这也避免了方法中的类型断言 abstract class Base<T> { public abstract getSmth(): T; } abstra

考虑一个泛型类:

abstract class Base<T={}> {
    public getSmth(): T {
        ...
    }
}

您不能对
t
的某些值抽象方法,而对
t
的其他值不抽象方法(即使该值是
t
的默认值)。更好的解决方案是将方法抽象,如果这是常见情况,则为
{}
提供默认实现。这也避免了方法中的类型断言

abstract class Base<T> {
    public abstract getSmth(): T;
}
abstract class EmptyBase extends Base<{}> { // Implementation for {}
    public getSmth(): {} {
        return {}
    }
}

class A extends EmptyBase {
    // No need to override `getSmth` 
}

class B extends Base<{ x: number }> {
    public getSmth() { // Need to override as generic differes
        return {x: 8};
    }
}

class C extends Base<{ x: number;}> { // Must override error if you don't
}
抽象类基类{
公共摘要getSmth():T;
}
抽象类EmptyBase扩展了{}的基{//实现
public getSmth():{}{
返回{}
}
}
类扩展了EmptyBase{
//无需重写'getSmth`
}
B类扩展了基本类{
public getSmth(){//需要作为泛型差异重写
返回{x:8};
}
}
类C扩展了基类{//,若不这样做,则必须重写错误
}

可以使用附加接口,但在这种情况下,您需要为每个子类明确指定它:

接口IBase{
getSmth():T;
}
抽象类基{
公共getSmth(){
返回{};
}
}
类扩展了基本实现IBase{
//不需要重写`getSmth`
}
类B扩展了基本实现IBase{
public getSmth(){//需要作为泛型差异重写
返回{x:8};
}
}
类C扩展了基本实现IBase{
//泛型参数的任何重写都不应是错误!
}
将出现一个错误:

类“C”不正确地实现了接口“IBase”。
属性“getSmth”的类型不兼容。
类型“()=>{}”不可分配给类型“()=>{x:number;}”。
类型“{}”不能分配给类型“{x:number;}”。
类型“{}”中缺少属性“x”。
abstract class Base<T> {
    public abstract getSmth(): T;
}
abstract class EmptyBase extends Base<{}> { // Implementation for {}
    public getSmth(): {} {
        return {}
    }
}

class A extends EmptyBase {
    // No need to override `getSmth` 
}

class B extends Base<{ x: number }> {
    public getSmth() { // Need to override as generic differes
        return {x: 8};
    }
}

class C extends Base<{ x: number;}> { // Must override error if you don't
}
interface IBase<T={}> {
    getSmth(): T;
}

abstract class Base<T={}> {
    public getSmth() {
        return {};
    }
}

class A extends Base<{}> implements IBase<{}> {
    // No need to override `getSmth`
}

class B extends Base<{ x: number }> implements IBase<{ x: number }> {
    public getSmth() { // Need to override as generic differes
        return {x: 8};
    }
}

class C extends Base<{ x: number }> implements IBase<{ x: number }> {
    // No override for a generic parameter should be a error!
}
Class 'C' incorrectly implements interface 'IBase<{ x: number; }>'.
  Types of property 'getSmth' are incompatible.
    Type '() => {}' is not assignable to type '() => { x: number; }'.
      Type '{}' is not assignable to type '{ x: number; }'.
        Property 'x' is missing in type '{}'.