如何在typescript中的类型化[value,error]元组中获得正确的推理



如何键入元组[value|null,Error|null]并获得正确的类型推断?

目前我正在使用这个,但我没有得到正确的类型推断

type TypedTuple<T = any> = [T, null] | [null, Error]
const fn = <T>(data: T): TypedTuple<T> => {
try {
if(Math.random() < 0.5) throw new Error('error')
return [data, null]
}catch(error){
return [null, error]
}
}
const [data, error] = fn('test')
if(error){
console.error(data) // data should be infered to null, but get infered as string | null
}

这里的问题是结果的析构函数,因为一旦将这些值析构函数分解为两个独立的变量,typescript就会分别考虑它们的类型。

要解决此问题,请在销毁项目之前执行缩小逻辑。这样,对原始类型[T, null] | [null, Error]进行缩小检查。通过这种方式,typescript可以正确地跟踪两个值之间的关系。

所以类似于:

const testResult = fn('test')
if(testResult[1]) {
const m = testResult[0] // Inferred as null.
console.error(m)
}

关键是,如果在检查之前进行析构函数,则会破坏两个值之间的关系。由于TypeScript当时不知道它是哪种元组,因此它会为每个变量提供相应索引的类型的并集。因此data被赋予类型null | T,而error得到Error | null。由于现在每个变量都有自己不同的类型,缩小其中一个变量对另一个变量没有影响。

然而,如果您能够帮助typescript在将两个元组类型分解之前确定结果是哪一个,那么您将获得正确的推断。

最新更新