Typescript条件类型不适用于不同的返回类型

时间:2019-01-03 17:29:54

标签: typescript

我想基于通用值返回其他类型。例如:

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扩展Base?字符串[]:   字符串

2 个答案:

答案 0 :(得分: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();

或者是类型断言(尽管如果您先对类型进行别名,效果会更好)

答案 1 :(得分:-1)

您将无法确定这样的返回类型。

替代方法是始终返回string [],并且当类不是从Base继承时返回数组中的单个值。