Typescript扩展方法声明而不重新实现

时间:2018-03-18 13:21:58

标签: typescript oop types

我有一个类,可以通过各种子类进行扩展。每个子类不需要重新实现类方法,只需要声明来推断正确的类型检查。

举个例子:

class QueryBuilder {
    insert<T>(data: T): string {
        return '';
    }   
}

class User extends QueryBuilder {
    insert<IUser>(data: IUser): string;
}

interface IUser {
    name: string,
    email: string
}

这样我就会收到以下错误:

Function implementation is missing or not immediately following the declaration.
(method) User.insert<IUser>(data: IUser): string

有没有办法得到我想要的东西,而不必为每个子类重复实现?

2 个答案:

答案 0 :(得分:1)

我正以错误的方式解决问题。

我应该将它分配给类,而不是将泛型类型分配给每个方法,如下所示:

class QueryBuilder<T> {
    insert(data: T): string {
        return '';
    }   
}

// Just set your interface as the generic type when extending,
// typechecking will work correctly now
class User extends QueryBuilder<IUser> {     
}

interface IUser {
    name: string,
    email: string
}

const user = new User();

user.insert('foo') // error
user.insert({ username: '' }) // error
user.insert({ name: '', email: '' }) // correct

答案 1 :(得分:1)

我认为有两种主要方法可以解决这个问题。第一种是将泛型参数移动到类中。如果要在集合中使用它,甚至可以给它一个默认值:

struct

如果你想要的类型在基类上作为属性可用,你可以做另一个技巧:

class QueryBuilder<T = any> {
    insert(data: T): string {
        return "";
    }
}

class User extends QueryBuilder<IUser> { }