我喜欢在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>