我喜欢在Typescript中使用strictNullChecks
选项来更好,更明确地处理null
/ undefined
的想法。但是我找不到启用strictNullChecks
的“ Failable Constructor” 模式的方法。
通常,默认的strictNullChecks
是所需的行为,但有时从构造函数返回undefined
是有意义的,并且代码更具可读性和灵活性,而不是在对象无法执行操作时抛出错误被创建。
对于常规函数类型,可以通过在函数的返回类型中添加undefined
来明确地允许这样做。但是Typescript不允许设置构造函数的返回类型。
有什么方法可以启用strictNullChecks
并且在某些情况下构造函数仍然可以返回undefined
吗?
答案 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>