【问题标题】:Typescript conditional types not working with different return types打字稿条件类型不适用于不同的返回类型
【发布时间】:2019-05-30 07:47:24
【问题描述】:

我想根据泛型值返回不同的类型。例如:

interface Base {
  key: string[];
}

class Test<T> {
  value = [];

  getSomething(): (T extends Base ? string[] : string) {
    if (Array.isArray(this.value)) {
      return ['a'] as string[];
    }

    return 'nothing' as string;
  }
}

const v = new Test<Base>().getSomething();

但我收到一个错误:

类型 string[] 不能分配给类型 T extends Base ?细绳[] : 字符串

【问题讨论】:

    标签: typescript


    【解决方案1】:

    仍然有未解析的条件类型(例如函数内部的T)类型参数通常不能从其他类型分配(没有类型断言)。 Typescript 将无法按照您的函数中的逻辑来确定分配是安全的。

    最安全的选择是使用单独的实现和公共签名:

    interface Base {
      key: string[];
    }
    
    class Test<T> {
      value = [];
    
      getSomething(): (T extends Base ? string[] : string)
      getSomething(): string[] | string {
        if (Array.isArray(this.value)) {
          return ['a'] as string[];
        }
    
        return 'nothing' as string;
      }
    }
    
    const v = new Test<Base>().getSomething();
    

    或者一个类型断言(虽然如果你先给类型加上别名,效果会更好)

    【讨论】:

      【解决方案2】:

      您将无法像这样决定返回类型。

      当类不是从 Base 继承时,另一种方法是始终返回 string[] 并在数组中返回单个值。

      【讨论】:

        猜你喜欢
        • 2021-09-18
        • 1970-01-01
        • 2021-12-17
        • 2022-07-07
        • 2021-09-17
        • 2020-06-29
        • 1970-01-01
        • 2021-09-05
        • 2019-10-25
        相关资源
        最近更新 更多