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

在指定其他类型时,如何让TypeScript推断受约束泛型类型的值?

丁书
2023-03-14

在TypeScript中,我有一个接受带有约束的泛型参数的函数:

function f1<U extends string>(param: U): U {
  return param;
}

const a1 = f1('hello');
// a1's type is 'hello' -- Great!

现在,我正在尝试这样做,以便您可以选择添加另一个类型作为返回类型的一部分。但是,当我这样做时,我必须为U类型提供一个默认参数。这使得TypeScript停止推断U的值,并使用我提供的默认类型:

function f2<T = never, U extends string = string>(param: U): U | T {
  return param;
}

const b1 = f2('hello');
// b1's type is 'hello' -- Great!

const b2 = f2<boolean>('hello');
// b2's type is string | boolean -- Terrible: I want the type to be 'hello' | boolean.

const b3 = f2<boolean, 'hello'>('hello');
// b3's type is 'hello' | boolean -- Poor: The type is correct but API is redundant.

所以我的问题是,有没有办法让TypeScript继续从参数推断类型?我不想为U提供默认类型,我总是希望TypeScript推断该值。伪代码,显示完整的API如何我想:

function f3<T = never, U extends string = infer>(param: U): U | T {
  return param;
}

const c1 = f3('hello');
// c1's type is 'hello' -- Great!

const c2 = f3<boolean>('hello');
// c2's type is 'hello' | boolean -- Great!

共有1个答案

汝弘深
2023-03-14

不幸的是,这是不可能的。有一个PR可以使用\ucode>符号添加部分推断,但它已经停用了很长一段时间。

唯一的解决方案是使用函数curry来实现此行为,尽管这并不理想:

function f2<T = never>() {
  return function <U extends string = string>(param: U): U | T {
    return param;
  }
}
const b2 = f2<boolean>()('hello');
// b2's type is string | 'hello' 

游乐场链接

 类似资料:
  • 我试图实现一个接受泛型参数的函数定义,只要它扩展了另一个特定的泛型类型。简言之参数A必须扩展参数B,其中A和B都是泛型的。 下面是我的示例 用法示例如下 一些封闭的班级 和函数调用 我不想在抽象类声明中定义E,因为T已经在那里定义了。 我也试着做了以下几点: 将myList定义为接受扩展T的键 将E定义为T类型(无法找到如何指定它在函数中扩展T 但它从来都不起作用。有没有办法做到这一点?我在Sta

  • 我在typescript中有以下泛型类 但是我不知道为什么得到这个错误Class'(匿名类)'不正确地扩展基类'列'。属性getValue的类型不兼容。类型'(值:数字)=

  • 泛型的类型约束 swapTwoValues(_:_:)函数和Stack类型可以用于任意类型. 但是, 有时在用于泛型函数的类型和泛型类型上, 强制其遵循特定的类型约束很有用. 类型约束指出一个类型形式参数必须继承自特定类, 或者遵循一个特定的协议、组合协议. 例如, Swift的Dictionary类型在可以用于字典中键的类型上设置了一个限制. 如字典中描述的一样,字典键的类型必须是可哈希的. 也

  • 约束允许将可接受类型参数的域仅限于值类型集(与包括值和引用类型的类型超集相比),但似乎也完全禁止可空类型,尽管在现代版本的C#。 如果我想接受具有附加的空性的值类型,比如

  • TypeScript 类型检查机制包含三个部分: 类型推断 类型保护 类型兼容性 本节介绍其中的类型推断,类型推断主要用于那些没有明确指出类型的地方帮助确定和提供类型,这是 TypeScript 的一种能力。 类型推断是有方向的,要注意区分从左向右和从右向左两种推断的不同应用。 1. 慕课解释 类型推断的含义是不需要指定变量类型或函数的返回值类型,TypeScript 可以根据一些简单的规则推断其