首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

typescript:如何从受查找类型约束的泛型函数返回正确的类型泛型返回联合

在 TypeScript 中,我们可以使用条件类型(Conditional Types)来实现从受查找类型约束的泛型函数返回正确的类型泛型返回联合。

首先,让我们了解一下条件类型的基本语法。条件类型使用三个部分组成:一个条件表达式,一个为 true 时的类型,一个为 false 时的类型。语法如下:

代码语言:txt
复制
T extends U ? X : Y

其中,T 是待检查的类型,U 是要进行检查的类型,X 是当 T 可以赋值给 U 时的返回类型,Y 是当 T 不可以赋值给 U 时的返回类型。

对于我们的问题,我们可以定义一个条件类型来检查泛型函数的返回类型是否是联合类型。如果是联合类型,则返回该联合类型;如果不是联合类型,则返回 never 类型。代码如下:

代码语言:txt
复制
type ReturnType<T> = T extends (...args: any[]) => infer R ? R : never;

在上述代码中,我们使用了 infer 关键字来推断泛型函数的返回类型 R。

接下来,我们可以使用 ReturnType 来定义一个泛型函数,该函数接受一个泛型函数作为参数,并返回其返回类型。代码如下:

代码语言:txt
复制
function getReturnType<T extends (...args: any[]) => any>(fn: T): ReturnType<T> {
  return null as any; // 这里需要根据实际情况返回正确的类型
}

在上述代码中,我们使用了 extends 关键字来约束传入的参数 fn 必须是一个泛型函数。

最后,我们可以使用 getReturnType 函数来获取泛型函数的返回类型,并将其赋值给一个变量。代码如下:

代码语言:txt
复制
function foo(a: number, b: string): number | string {
  return Math.random() > 0.5 ? a : b;
}

const result: ReturnType<typeof foo> = null as any; // 这里需要根据实际情况赋值正确的类型

在上述代码中,我们使用 typeof 关键字来获取泛型函数 foo 的类型,并将其作为参数传递给 getReturnType 函数,从而获取泛型函数的返回类型。

需要注意的是,上述代码中的 null as any 和注释部分需要根据实际情况进行替换,以确保返回的类型是正确的。

推荐的腾讯云相关产品:无

希望以上内容能够帮助到您!如果还有其他问题,请随时提问。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C#中的泛型约束:如何利用泛型约束来提高代码的类型安全性和灵活性?

泛型约束是指可以对泛型类型参数进行限制,只允许特定类型或满足特定条件的类型作为泛型参数。...使用泛型约束可以提高代码的类型安全性和灵活性,以下是一些常见的泛型约束及其作用: 类型约束(class constraint):使用 where T : class 约束可以确保泛型参数必须是引用类型...结构约束(struct constraint):使用 where T : struct 约束可以确保泛型参数必须是值类型。这可以避免在泛型方法中使用引用类型参数,以提高性能和避免空引用异常。...基类约束(base class constraint):使用 where T : 基类名称 约束可以确保泛型参数必须是指定基类的派生类。这可以确保泛型参数具有特定的行为和属性。...通过使用这些泛型约束,可以在编译时捕获潜在的类型错误,并提供更好的类型安全性。同时,约束也提供了更灵活的代码设计,可以根据特定的约束条件编写更通用、可复用的代码。

8110
  • 在 TypeScript 中使用泛型:使用指南

    下面例子是一个简单泛型函数,该函数返回任何类型的数组中的第一个元素: function getFirstItem(items: T[]): T | undefined { return items...(item); } // 从 return 语句返回的类型推断是 "T | undefined" pop() { return this.data.shift(); } } Queue...在该章节中,我们将讨论使用使用泛型的基本技巧,以及如何避免可能导致复杂错误或降低代码可读性的错误。 命名泛型变量的最佳实践 命名泛型变量应该是直观的,如果可能,应该具有描述性。...避免泛型中常见的错误 使用泛型中一个常见的错误是假设一个泛型有确定的属性或者方法而没正确约束。这个会导致运行时错误。当我们希望一个类型变量有特定的行为,要时刻记得定义合适的约束。...泛型应该用来添加有意义,可扩展性的代码。 如果一个类型只是覆盖少数特定类型,应该使用联合类型 union type。

    16910

    《现代Typescript高级教程》泛型和类型体操

    让我们继续探讨 extends 关键字、TS 官方内置的一些泛型函数以及它们的使用。 extends 关键字和类型约束 在泛型中,我们可以使用 extends 关键字来对泛型类型进行约束。...Pick Pick 是 TypeScript 中的另一个内置泛型函数,它可以从给定类型 T 中选择指定的属性 K 组成一个新的类型。...我们还可以结合泛型和内置泛型函数来实现更复杂的类型操作。以下是一个示例,展示了如何使用 Pick 和泛型来创建一个函数,该函数从给定对象中选择指定属性,并返回一个新的对象。...这个例子结合了泛型、内置泛型函数 Pick、keyof 操作符和 extends 关键字,展示了如何在 TypeScript 中处理复杂的类型操作和转换。...Exclude Exclude 是 TypeScript 中的一个内置泛型函数,用于从类型 T 中排除类型 U。

    37930

    typescript基础篇(6):泛型

    在TypeScript中,可以使用泛型来创建可重用的组件,一个组件可以支持多种类型的数据。这样用户就可以以自己的数据类型来使用组件。...应当如何实现呢? 现在有两种解决方式:我们已经函数重载,联合类型。 // 1....6.2 泛型函数调用 泛型函数有两种调用方式: log("aaa") log(["aaa", "bbb"]) 不仅可以用泛型定义函数还可以定义泛型函数类型,格式和函数签名差不多: const...const log2 = new Log() 注意,泛型不得用于静态成员(static声明的成员) 6.5 类型约束 有时候我们会希望实现类似这样的功能: const log = (value:...这种逻辑别说在ts,在js也算不得很好的实践。 这时,就需要类型约束。

    99520

    终于搞懂TS中的泛型啦!!

    >("Hello, TypeScript"); // 传入 string 类型 在第一次调用时,类型参数 number 被传递给 identity 函数,所以返回值的类型也是 number。...示例 2 和示例 3 展示了如何使用泛型函数并指定参数的类型。 。 # 2. 使用泛型变量: 泛型变量允许我们在函数或类中使用一种不确定的类型,而在实际使用时才确定具体的类型。...我们定义了一个泛型函数reverse,接受一个数组参数,并返回反转后的数组。...这样一来,我们可以在类实例化时指定具体的类型,从而创建适用于不同类型数据的类的实例。 # 5. 泛型约束: 泛型约束允许我们限制泛型类型的范围,使其满足特定条件 # 5.1....# 5.2 检查对象的 key 1、keyof typescript 中检测类型的方法,以联合类型的方式方返回类型的所有 key 2、搭配泛型约、 refshttps

    42020

    【TypeScript 4.5】005-第 5 章 函数

    【TypeScript 4.5】005-第 5 章 函数 一、函数类型表达式 1、概述 函数 函数是任何应用程序的基本构件 无论是本地函数 还是从模块中导入的函数 或者类上的函数等等 向其他很多值一样...1、概述 说明 在写函数的时候输入的类型与输出的类型常常存在一定关系 我们会使用发泛型来解决 代码分析 此处,函数输入与返回都是any,我们希望函数返回值类型就是数组元素的类型,这就用到了泛型!...3、多个泛型 代码示例及解释 说明: 两个泛型参数 T、Q 函数的第一个参数是 T 数组,第二个参数是返回 Q 的函数 函数的返回值是 Q 数组 function map(arr: T...-限制条件 1、概述 说明 有时候我们希望一个泛型是某个类型的子集 此时我们就需要对泛型的取值范围进行限制了 这和 Java 不一样 代码示例 T extends { length: number }...六、泛型函数-使用受限值 1、代码分析 使用通用约束条件时的常见错误!

    12510

    类型即正义,TypeScript 从入门到实践(四):5000字长文带你重新认识泛型

    欢迎阅读 类型即正义,TypeScript 从入门到实践系列: 《类型即正义:TypeScript 从入门到实践(序章)》[3] 《类型即正义:TypeScript 从入门到实践(一)》[4] 《类型即正义...:TypeScript 从入门到实践(二)》[5] 《类型即正义:TypeScript 从入门到实践(三)》[6] 《类型即正义:TypeScript 从入门到实践(四)》(也就是这篇) 在之前的文章中...经过上面的例子,我们发现,其实泛型,就像是一个关于 “类型的函数” 一样,给定输入的类型变量,然后可以使用输入变量经过组合比如 T[] 、进行联合类型或交叉类型操作,来作为注解类型使用。...image.png 泛型,继续前进 接下来我们继续深入泛型,解答之前文章里的一些疑问,比如: 泛型数组 类泛型 同时我们还会了解一些新的概念,比如: 接口泛型 类型别名泛型 泛型约束 解决遗留的问题 泛型数组...重申:没有补全的 TypeScript 代码是没有生命的! 那么我们如何让在既使用泛型的同时,还能获得代码补全了?答案相信你也猜到了, 那就是我们这一节要讲的泛型约束。

    1.7K20

    TypeScript 中的泛型

    function printArray(arr: E[]): void { arr.forEach(item => console.log(item));}R: 用于表示函数返回值的泛型类型参数...泛型函数(Generic Functions)使用泛型来创建一个可以处理不同类型的函数:实例function identity(arg: T): T { return arg;}// 使用泛型函数...它接受一个参数 arg 和返回值都是泛型类型 T。在使用时,可以通过尖括号 明确指定泛型类型。第一个调用指定了 string 类型,第二个调用指定了 number 类型。2....泛型约束(Generic Constraints)有时候你想限制泛型的类型范围,可以使用泛型约束:实例// 基本语法interface Lengthwise {    length: number;}function...); // 推断为 number 类型说明: 这个例子展示了带有默认值的泛型函数。

    14710

    一文带你来了解 TypeScript 泛型

    什么是泛型我们先来看看 ChatGPT 怎么说:泛型就是 将类型进行传递,然后确保在使用的时候类型正确。泛型优缺点优点类型安全:使用泛型可以让代码在编译时就发现类型错误,避免了运行时类型错误的发生。...提高性能:泛型代码在 TypeScript 中不需要进行额外的类型检查和类型转换,可以提高程序的运行效率。...约束较强:在 TypeScript 中,泛型的类型参数需要满足一定的约束条件,这可能会限制泛型的使用范围和灵活性。...需要考虑类型擦除:与 Java 中类似,泛型在 TypeScript 中也是通过类型擦除实现的,这可能会影响一些泛型代码的实现和设计。..., 泛型函数继承接口,则参数必须实现接口中的属性,这样就达到了泛型函数的约束。

    58241

    深入学习下 TypeScript 中的泛型

    您还将探索一个异步示例,了解何时将类型参数直接传递给您的泛型,以及如何为您的泛型类型参数创建约束和默认值。...这里的 TypeScript 从调用代码本身推断泛型类型。这样调用代码不需要传递任何类型参数。...ResultType 泛型类型参数的泛型函数。...这意味着 TypeScript 会将数据识别为具有字符串类型的键和任意类型的值的对象,从而允许您访问其属性。类型参数约束在某些情况下,泛型类型参数需要只允许将某些形状传递给泛型。...本节介绍了将泛型与函数一起使用的多种方法,包括直接分配类型参数以及为参数形状设置默认值和约束。 接下来,您将通过一些示例来了解泛型如何使接口和类适用于更多情况。

    17710

    深入学习下 TypeScript 中的泛型

    您还将探索一个异步示例,了解何时将类型参数直接传递给您的泛型,以及如何为您的泛型类型参数创建约束和默认值。...这里的 TypeScript 从调用代码本身推断泛型类型。这样调用代码不需要传递任何类型参数。...ResultType 泛型类型参数的泛型函数。...这意味着 TypeScript 会将数据识别为具有字符串类型的键和任意类型的值的对象,从而允许您访问其属性。 类型参数约束 在某些情况下,泛型类型参数需要只允许将某些形状传递给泛型。...本节介绍了将泛型与函数一起使用的多种方法,包括直接分配类型参数以及为参数形状设置默认值和约束。 接下来,您将通过一些示例来了解泛型如何使接口和类适用于更多情况。

    39K30

    【愚公系列】2021年12月 Typescript-泛型

    文章目录 一、typeScript中的泛型 1、泛型的定义 2、泛型函数 3. 泛型类 4....函数定义 5 泛型接口 5.1 函数类型接口 5.2 泛型接口(1) 5.3 泛型接口(2) 5.4 泛型在类中的运用 二、TypeScript泛型类 把类作为参数类型的泛型类 ---- 一、typeScript...中的泛型 泛型的定义 泛型函数 泛型类 泛型接口 1、泛型的定义 泛型:软件工程中,我们不仅要创建一致的定义良好的API,同时也要考虑可重用性。...通俗理解:泛型就是解决 类 接口 方法的复用性、以及对不特定数据类型的支持(类型校验) 2、泛型函数 只能返回string类型的数据 function getData(value:string):string...x } }; var a2 = new A2('abc'); //实例化 a2.action('3') 二、TypeScript泛型类 把类作为参数类型的泛型类 把类作为参数来约束数据传入的类型

    56020

    【文末送书】Typescript 使用日志

    泛型表示的是一个类型在定义时并不确定,需要在调用的时候才能确定的类型,主要包含以下几个知识点: •泛型函数•泛型类•泛型约束 T extends XXX 我们试想一下,如果一个函数,把传入的参数直接输出...(true); 其实泛型本来很简单,但许多初学 Typescript 的同学觉得泛型很难,其实是因为泛型可以结合索引查询符 keyof、索引访问符 T[k] 等写出难以阅读的代码,我们来看一下。...•对象中的兼容•函数返回值兼容•函数参数列表兼容•函数参数结构兼容•类中的兼容•泛型中的兼容 在 Typescript 中是通过结构体来判断兼容性的,如果两个的结构体一致,就直接兼容了,但如果不一致,Typescript...•animal => animal •返回值不对,返回值始终是协变的,必须多传。 •animal => grayDog •正确。 所以,函数参数类型应该是逆变的。...泛型中的兼容 泛型中的兼容,如果没有用到 T,则两个泛型也是兼容的。

    2.9K10

    一起重学TypeScript

    如果传入了一个 string 类型的参数,那么我们也不知道它返回啥类型。 泛型 : 它可以使 返回类型 和 传入类型 保持一致,这样我们可以清楚的知道函数返回的类型为什么类型。...5.1 泛型接口 泛型接口可以这样理解: 当你需要给接口指定类型时,但目前不知道属性类型为什么时,就可以采用泛型接口 你可以给接口指定参数为多个泛型类型,也可以单个;当使用时,明确参数类型即可。...22 5.2 泛型函数 定义泛型函数,可以让 传入参数类型参数 和 返回值类型保持一致。...接口约束 通过定义接口, 泛型函数继承接口,则参数必须实现接口中的属性,这样就达到了泛型函数的约束 类约束 通过给类的泛型指定为另一个类,这样就规定了类泛型的类型都为另一个类 # 第一种 // 定义接口...interface DataInfo{ title: string, price: number } // 泛型函数 继承接口,进行对参数类型约束, 如果传入的参数中,没有包含接口属性

    2K00

    Typescript 使用日志(干货)

    泛型表示的是一个类型在定义时并不确定,需要在调用的时候才能确定的类型,主要包含以下几个知识点: •泛型函数•泛型类•泛型约束 T extends XXX 我们试想一下,如果一个函数,把传入的参数直接输出...(true); 其实泛型本来很简单,但许多初学 Typescript 的同学觉得泛型很难,其实是因为泛型可以结合索引查询符 keyof、索引访问符 T[k] 等写出难以阅读的代码,我们来看一下。...•对象中的兼容•函数返回值兼容•函数参数列表兼容•函数参数结构兼容•类中的兼容•泛型中的兼容 在 Typescript 中是通过结构体来判断兼容性的,如果两个的结构体一致,就直接兼容了,但如果不一致,Typescript...•animal => animal •返回值不对,返回值始终是协变的,必须多传。 •animal => grayDog •正确。 所以,函数参数类型应该是逆变的。...泛型中的兼容 泛型中的兼容,如果没有用到 T,则两个泛型也是兼容的。

    2.5K10

    TypeScript学习指南(有PDF小书+思维导图)

    如果传入了一个 string 类型的参数,那么我们也不知道它返回啥类型。 泛型 :它可以使 返回类型 和 传入类型 保持一致,这样我们可以清楚的知道函数返回的类型为什么类型。...5.1 泛型接口 泛型接口可以这样理解: 当你需要给接口指定类型时,但目前不知道属性类型为什么时,就可以采用泛型接口 你可以给接口指定参数为多个泛型类型,也可以单个;当使用时,明确参数类型即可。...22 5.2 泛型函数 定义泛型函数,可以让 传入参数类型参数 和 返回值类型保持一致。...接口约束 通过定义接口, 泛型函数继承接口,则参数必须实现接口中的属性,这样就达到了泛型函数的约束 类约束 通过给类的泛型指定为另一个类,这样就规定了类泛型的类型都为另一个类 # 第一种 // 定义接口...interface DataInfo{ title: string, price: number } // 泛型函数 继承接口,进行对参数类型约束, 如果传入的参数中,没有包含接口属性

    3.1K31

    一文搞懂TypeScript泛型,让你的组件复用性大幅提升

    我们将深入探讨在TypeScript中使用泛型的方法,展示如何在函数、类和接口中使用它们。我们将会讨论如何传递默认泛型值、多个值以及条件值给泛型。最后,我们还会讨论如何为泛型添加约束。...我们用字母 Y 表示,并将其默认类型设置为 number,因为它将用于乘以从数组中挑选的随机数。因为我们在处理数字,所以可以传递默认的泛型类型 number。...whichPet 的返回值将是一个基于回调函数中提供的条件的值数组。我们可以添加条件并定义逻辑,以根据需求和具体情况进行调整。 七 、为泛型添加约束 泛型允许我们处理作为参数传递的任何数据类型。...接着,我们创建了一个ApiService类,其中包括一个泛型函数,该函数接受一个URL路径并返回一个Promise。...必要时应用约束 使用类型约束(extends关键字)来限制可以与泛型一起使用的类型,确保只接受兼容的类型。

    53510

    TS核心知识点总结及项目实战案例分析

    和js的class一致, typescript的类有公共,私有与受保护的修饰符....泛型 我们可以使用泛型来创建可重用的组件,一个组件可以支持多种类型的数据。这样用户就可以以自己的数据类型来使用组件。...泛型是typescript中比较难懂的知识点, 但是非常重要, 几乎任何第三方组件库里都会用到....(arg.length) return arg; } 复制代码 类似于函数类型的定义, 我们也可以定义泛型接口, 并且可以把泛型参数当作整个接口的一个参数, 这样我们就能清楚的知道使用的具体是哪个泛型类型...year: T; compute: (x: T, y: T) => T; } let myGenericNumber = new MyNumber(); 复制代码 我们还可以定义泛型约束来更准确的控制类的类型

    1.7K10

    TypeScript中泛型及泛型函数、泛型类、泛型接口,泛型约束,一文读懂

    最近在学TypeScript,然后整理了一下关于TypeScript中泛型的一些笔记。...泛型的定义(generic type 或者 generics) 泛型是TypeScript语言中的一种特性。 是程序设计语言的一种特性。泛型是一种参数化类型。 ...泛型函数的定义 function 函数名(参数1:T,...,参数n:类型):返回类型 { //函数体 } function 函数名(参数1:T,......,参数n:类型):返回类型 { //函数体 } 泛型类的定义 class 类名{ //属性和方法签名} class 类型{ //属性和方法签名 } 泛型接口的定义...但是有些情况下,函数需要处理的数据有一定的约束,比如有一个泛型函数需要访问泛型参数T的length属性,并加1。基于这种需求,必须对泛型参数T进行约束,也就是泛型约束。

    2.8K30
    领券