如何定义将类型作为强类型参数的 Typescript 函数
How to define Typescript function that takes a type as a strongly typed argument
我想创建一个接受扩展特定类型的类型(使用 export class
创建并正常导入)的函数。我有一个 Page
class 和许多派生的 classes。用简单的英语来说,我想要一个函数接受 Page
, DerivedPage
, AnotherDerivedPage
classes (不是实例) ,显然,试图避免 any
并保持强类型。
我该怎么做?
您只需要使用构造函数签名:
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);
}
根据需要,您还可以创建一个保留参数和 class 类型的更通用的版本:
//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
如果您只想要 类 页面,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) => { /* ... */ }
我想创建一个接受扩展特定类型的类型(使用 export class
创建并正常导入)的函数。我有一个 Page
class 和许多派生的 classes。用简单的英语来说,我想要一个函数接受 Page
, DerivedPage
, AnotherDerivedPage
classes (不是实例) ,显然,试图避免 any
并保持强类型。
我该怎么做?
您只需要使用构造函数签名:
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);
}
根据需要,您还可以创建一个保留参数和 class 类型的更通用的版本:
//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
如果您只想要 类 页面,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) => { /* ... */ }