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 '{}'.