无法获取打字稿键入以匹配

时间:2019-06-03 19:08:10

标签: javascript typescript

我无法使以下代码正常工作。

我试图获取一些数据并处理所有虚假/错误情况,然后将清除的数据传递给另一个函数。但是,当我调用第二个函数时,类型似乎不匹配。

  

输入“错误|不能将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)
}

TypeScript playground link

2 个答案:

答案 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)