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

奥斯特

在TypeScript中,我有一个函数可以接受带有约束的通用参数:

函数f1 <U扩展字符串>(param:U):U { 
  return param; 
} 

const a1 = f1('hello'); 
// a1的类型是'hello'-太好了!

现在,我正在尝试使其成为可能,因此您可以选择添加其他类型作为返回类型的一部分。但是,这样做时,必须提供U类型的默认参数。这样一来,TypeScript就可以停止推断U的值,并使用我提供的默认类型:

函数f2 <T =从不,U扩展string = string>(param:U):U | T { 
  return param; 
} 

const b1 = f2('hello'); 
// b1的类型是'hello'-太好了!

const b2 = f2 <boolean>('hello'); 
// b2的类型是字符串| 布尔值-糟糕:我希望类型为“ hello” | 布尔值。

const b3 = f2 <布尔值,'hello'>('hello'); 
// b3的类型为'hello'| 布尔值-较差:类型正确,但API是多余的。

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

函数f3 <T =永不,U扩展字符串=推断>(参数:U):U | T { 
  return param; 
} 

const c1 = f3('hello'); 
// c1的类型是'hello'-太好了!

const c2 = f3 <boolean>('hello'); 
// c2的类型为'hello'| 布尔值-太好了!
提香·切尔尼科娃·德拉戈米尔

不幸的是,这是不可能的。有一个PR可以使用_sigil添加部分推断,但是已经有一段时间没有使用了。

唯一的解决方案是使用函数currying获得此行为,尽管这不是理想的:

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' 

游乐场链接

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在推断泛型类型时避免扩展

类型受约束的C#泛型的无效类型转换

TypeScript条件类型的映射与受约束的泛型映射不同吗?

TypeScript泛型:参数类型推断

TypeScript中的泛型:如何从类中推断实例的类型

C#泛型:如何指定类型约束并返回泛型类型的实例

TypeScript中泛型类型的子类型的推断

泛型类型限制受其他两个泛型类型的约束

TypeScript对类型约束的推断

使用Typescript泛型的显式值类型约束?

类型定义中使用泛型和条件时,Typescript不会推断switch语句中的类型

有没有办法在TypeScript中实例化受约束的泛型类型的实例?

Typescript泛型:从函数参数的类型推断类型?

推断时泛型类型丢失

具有对其他类型参数的约束的类型参数的泛型推断

调用泛型方法时如何推断参数类型?

从泛型推断类型

如何在C#中将受约束的泛型类型的Action委托存储在类型安全的集合中?

调用函数时明确指定泛型类型约束

Java泛型 - 推断类型不符合等式约束

为什么泛型 T 仅在具有约束时才被推断为文字类型?

泛型类型推断的 Typescript 泛型

基于继承的Typescript泛型类型推断

如何使用受约束的泛型值类型在 TypeScript 中创建对象?

如何在 Typescript 函数接口中约束泛型类型?

扩展泛型类时推断类型

TypeScript 类型推断与泛型类型的交集

TypeScript 类型获取约束函数类型泛型的返回类型

传递参数时,Typescript 泛型类型被推断为未知