首页 > 解决方案 > 无法使打字稿打字匹配

问题描述

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

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

输入“错误 | 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 游乐场链接

标签: javascripttypescript

解决方案


您可以通过将类型检查逻辑移动到类型谓词中来解决此问题。这是您的示例,修改为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)
}

推荐阅读