typescript 将类型注解为基类的子类的类型

cxfofazt  于 2023-04-13  发布在  TypeScript
关注(0)|答案(1)|浏览(128)

给定一个Parent类,其子级为ChildAChildB

abstract class Parent {
    abstract foo()
}
class ChildA extends Parent {
    foo() { }
    bar() { }
}
class ChildB extends Parent {
    foo() { }
    baz() { }
}

我怎样才能严格地将函数的参数输入为任何类 (类本身,而不是示例),它符合类型Parent,但本身不是Parent

fn(Parent) // Should fail, is supertype rather than subtype
fn(new ChildA()) // should fail, is instance of subtype rather than class itself
fn(new ChildB()) // should fail, is instance of subtype rather than class itself
fn(ChildA) // Should succeed
fn(ChildB) // Should succeed
yhxst69z

yhxst69z1#

您可以使用构造签名将fn定义如下:

function fn(ctor: new (...args: any[]) => Parent) {}

这描述了一个构造函数,它创建了一些扩展Parent的东西(结构上,在类型系统中)。有趣的是,这非常接近抽象构造签名文档中的示例。
传入Parent将失败,因为Parent有一个抽象构造函数:

fn(Parent);
// ~~~~~~ Cannot assign an abstract constructor type to a non-abstract constructor type.

Playground
提到一个即使Parent类不是抽象的也能工作的方法也会有帮助。你需要首先检查给定的类是否是Parent。谢天谢地,这是可能的,因为类型在被示例化之前就被推断出来了:

function fn<Ctor extends new (...args: any[]) => Parent>(ctor: typeof Parent extends Ctor ? never : Ctor) {}

Playground

相关问题