带有“ strictNullChecks”编译器选项的构造函数失败

时间:2019-02-13 11:51:15

标签: typescript

我喜欢在Typescript中使用strictNullChecks选项来更好,更明确地处理null / undefined的想法。但是我找不到启用strictNullChecks“ Failable Constructor” 模式的方法。

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

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

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

1 个答案:

答案 0 :(得分:1)

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>

一个问题是,由于打字稿无法在构造函数的返回中处理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>