具有"strictNullChecks"编译器选项的可失败构造函数



我喜欢在Typescript中使用strictNullChecks选项的想法,以更好,更明确的null/undefined处理。但是我找不到使用strictNullChecks启用的实现"故障构造函数" 模式的方法。

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

使用常规功能类型,可以通过将undefined添加到函数的返回类型中明确允许。但是打字稿不允许设置构造函数的返回类型。

是否有任何方法可以启用strictNullChecks,并且在某些情况下仍然有能力返回undefined

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>

最新更新