当前位置: 首页 > 知识库问答 >
问题:

Typescript条件类型不使用不同的返回类型

公西俊能
2023-03-14

我想基于泛型值返回不同的类型。例如:

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();

但我有一个错误:

类型字符串[]不能分配给类型T扩展Base?String[]:字符串

共有2个答案

丌官坚秉
2023-03-14

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

另一种方法是,当类不是从基继承时,总是返回字符串[],并在数组中返回单个值。

金理
2023-03-14

条件类型中仍然有未解析的类型参数(如函数中的T),通常不能从另一种类型(没有类型断言)分配。打字稿将无法遵循函数中的逻辑来确定分配是安全的。

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

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();

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

 类似资料:
  • 在报告bug之前,我想知道是否有办法做到这一点。以下是有关该问题的闪电战:https://stackblitz.com/edit/rxjs-wdvejf?file=index.ts 在下面的假设示例中,基于传入的枚举值(在本例中为映射键和函数参数),条件类型为或。Typescript正确地强制转换了到的实例,但即使是的一种类型,如果没有hack(强制转换),也无法从函数返回值。 以下是条件类型:

  • 本节介绍 TypeScript 高级类型中的条件类型(conditional type),条件类型就是在初始状态并不直接确定具体类型,而是通过一定的类型运算得到最终的变量类型。 1. 慕课解释 条件类型用来表达非均匀类型映射,可以根据一个条件表达式来进行类型检测,从两个类型中选出其中一个: T extends U ? X : Y 语义类似三目运算符:若 T 是 U 的子类型,则类型为 X,否则类

  • (Spring的@CachePut注释是否适用于void返回类型?) 我遇到了同样的问题 因为这个问题已经存在很长时间了,我不知道是否有解决办法 创建缓存: 使用@CachePut更新此缓存 输出: 我搜索了几天信息,但没有找到答案 除了使用@CacheEvict(cacheNames=userCache,allEntry=true) 有没有办法用@Cacheable和@CachePut解决? 非

  • 请原谅稍微不完整的代码,当我遇到这个问题时,我正在重组它。其要点是,在调用中,编译器表示/*Here*/的地方,编译器强制使用类型,但是当返回时,我希望通过返回204来处理,否则我希望返回200。我怎么才能做到? 理想情况下,我可以在map调用中检查它是否是mono.empty(),但如果它是空的mono,它似乎不会输入map。想过使用optionals,但它们似乎不能很好地使用单音。

  • 我在玩TypeScript中的条件类型。我想用条件返回类型编写一个函数。如果函数被传递一个字符串,它将返回一个名称,否则它将返回一个Id。 我在返回语句中得到以下错误: 我错过了什么?Thnx! 编辑:直接摘自Anders Hejlsberg在Build 2018上的演讲:https://youtu.be/hDACN-BGvI8?t=2241 他甚至说“我们不再需要写函数重载了…” 如果我将代码更

  • 问题内容: 为什么仅通过更改返回类型就不可能重载函数?将来的Java版本会改变吗? 顺便说一句,仅供参考,这在C ++中可能吗? 问题答案: 你无法在Java中做到这一点,也无法在C ++中做到这一点。基本原理是,仅返回值不足以使编译器确定要调用的函数: