首页 > 解决方案 > 带有“strictNullChecks”编译器选项的可失败构造函数

问题描述

我喜欢strictNullChecks在 Typescript 中使用选项以获得更好和更明确null/undefined处理的想法。但是我找不到启用启用“可失败构造函数”模式的方法strictNullChecks

通常默认值strictNullChecks是所需的行为,但有时undefined从构造函数返回是有意义的,并且代码更具可读性和灵活性,而不是在无法创建对象时抛出错误。

对于常规函数类型,这可以通过添加undefined到函数的返回类型来明确允许。但是 Typescript 不允许设置构造函数的返回类型。

有什么方法可以启用并且在某些情况下strictNullChecks仍然可以让构造函数返回?undefined

标签: typescript

解决方案


Typescript 不支持类中构造函数的返回类型的类型注释。

您可以声明该类并将构造函数单独定义为返回InstanceType | undefined

class _X {
    constructor() {
        if (Math.random() > 0.5) return undefined as any;
    }
}

const X = _X as MakeFailable<typeof _X>;

type MakeFailable<T extends new (...a: any[]) => any> = {
    new (...a: ConstructorParameters<T>): undefined | InstanceType<T>
} & Pick<T, keyof T>

一个问题是,以这种方式获得的类将不可继承,因为 typescript 无法处理undefined构造函数的返回。

你甚至可以创建一个辅助函数来更好地隐藏实现类:

type MakeFailable<T extends new (...a: any[]) => any> = {
    new (...a: ConstructorParameters<T>): undefined | InstanceType<T>
} & Pick<T, keyof T>

function makeFailable<T extends new (...a: any[]) => any>(cls: T): MakeFailable<T> {
    return cls as any
}

const Foo = makeFailable(class {
    constructor() {
        if (Math.random() > 0.5) return undefined as any;
    }
})
type Foo = InstanceType<typeof Foo>

推荐阅读