我无法使以下代码正常工作。
我试图获取一些数据并处理所有虚假/错误情况,然后将清除的数据传递给另一个函数。但是,当我调用第二个函数时,类型似乎不匹配。
输入“错误|不能将number []'分配为类型'number []'
interface SomeType {
a: number[] | null | Error
b: number[] | null
}
type Omit <T, K> = Pick<T, Exclude<keyof T, K>>
type ExcludeUnusableValues<T,K extends keyof T,C = Error | null>
= Omit<T, K> & {
[a in K]-? : Exclude<T[a], C>
}
function fetchData() {
const obj: SomeType = {
a: [1, 2, 3],
b: null
}
if (obj.a === null || obj.a instanceof Error) {
return null
}
// Type 'Error | number[]' is not assignable to type 'number[]'
useData(obj)
}
function useData(param1: ExcludeUnusableValues < SomeType, 'a' > ) {
console.log(param1)
}
答案 0 :(得分:1)
您可以通过将类型检查逻辑移动到类型谓词中来解决此问题。这是您的示例,使用isUsableType
进行了修改:
interface SomeType {
a: number[] | null | Error
b: number[] | null
}
function isUsableType(obj: SomeType): obj is ExcludeUnusableValues < SomeType, 'a' > {
return obj.a!==null && !(obj.a instanceof Error)
}
type Omit <T, K> = Pick<T, Exclude<keyof T, K>>
type ExcludeUnusableValues<T,K extends keyof T,C = Error | null>
= Omit<T, K> & {
[a in K]-? : Exclude<T[a], C>
}
function fetchData() {
const obj: SomeType = {
a: [1, 2, 3],
b: null
}
if (isUsableType(obj)) {
useData(obj)
} else return null;
}
function useData(param1: ExcludeUnusableValues < SomeType, 'a' > ) {
console.log(param1)
}
答案 1 :(得分:0)
简短答案::从 SomeType.a 中删除类型错误。
长答案:
a: number[] | null;
a 可以是数字数组,也可以是null。完全可以,因为 a 退出或不退出。
a: number[] | null | Error;
在这里,键入错误会引起问题,因为错误与数字数组没有相同的属性/功能。为此,所有类型都必须具有一些相似的属性。
另一种解决方案: 强制转换obj为适当的类型:
useData(<{a: number[], b: number[]}>obj)