网站搜索

继承 - 如何定义接受类型作为强类型参数的 Typescript 函数


我想创建一个函数,该函数接收一个类型(使用 export class 创建并正常导入)并继承自特定类型。我有一个 Page 类和许多派生类。用简单的语言说,我希望有一个函数可以接受 Page、DerivedPage、AnotherDerivedPage 类(不是实例),显然,我希望避免使用 any 并保持强类型。

我该怎么做?

答案#1

如果你只想要类 Page、DerivedPage、AnotherDerivedPage;你可以使用如下方法:

function foo (foo: Page | DerivedPage | AnotherDerivedPage)

如果你想要一个扩展 Page 的参数,下面可能是可行的方法:

function foo<T extends Page> (a: T) { ... }

编辑:
添加一个这类示例以与箭头函数一起使用

type foo<T extends Page> = (v: T) => void
const fn: foo<DeribedPage> = (v) => { /* ... */ }

答案#2

你只需要使用构造函数签名:

class Page {
    private p!: string;
}
class DerivedPage extends Page { }
class OtherPage extends Page { 
    constructor(param: number){
        super();
    }
}
class NotPage { private np!: string; }

function createPage(ctor: new (...a: any[])=> Page, ...a: any[]) {
    new ctor(...a);
}

根据需要,你也可以创建一个更通用的版本,以保留参数和类类型:

//Preserves argument and class type
function genericCreatePage<T extends Page, A extends any[]>(ctor: new (...a: A)=> T, ...a:A){
    return new ctor(...a);
}

genericCreatePage(DerivedPage)
genericCreatePage(OtherPage, 0)
genericCreatePage(OtherPage, "0") //err