首页 > 其他分享 >【TS】TypeScript内置条件类型-ReturnType

【TS】TypeScript内置条件类型-ReturnType

时间:2024-09-23 09:26:32浏览次数:1  
标签:TypeScript 函数 TS 类型 Vue ReturnType any

ReturnType

在TypeScript中,ReturnType 是一个内置的条件类型(Conditional Type),它用于获取一个函数返回值的类型。这个工具类型非常有用,特别是当你需要引用某个函数的返回类型,但又不想直接写出那个具体的类型时。

ReturnType 的基本语法如下:

type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : any;

例如,如果你有一个函数createApp,它是Vue 3中用于创建Vue应用实例的函数,你可以这样使用ReturnType来获取它的返回类型:

import { createApp } from 'vue';  
  
// 假设App是一个Vue组件  
import App from './App.vue';  
  
// 使用ReturnType获取createApp的返回类型  
type VueApp = ReturnType<typeof createApp>;  
  
const app: VueApp = createApp(App);  
  
// 现在app的类型是VueApp,它实际上是createApp函数的返回类型  
// 在Vue 3中,这通常是一个具有mount、component、directive等方法的对象  
  
// 如果你有一个函数需要接受这样的Vue应用实例作为参数  
function useApp(appInstance: VueApp) {  
  // ...  
}  
  
// 你可以安全地将app传递给这个函数  
useApp(app);

注意,ReturnType 只能用于函数类型。如果你尝试将它用于非函数类型,TypeScript会报错。createApp是Vue库的一部分,并且Vue库是用TypeScript编写的,所以ReturnType能够准确地推断出Vue应用实例的类型。

了解释这个类型定义,我们可以将其分解为几个部分:

  • 泛型约束:T extends (...args: any[]) => any
    这部分定义了一个泛型T,它必须是一个函数类型。这个函数类型可以接受任意数量和类型的参数(由(...args: any[])表示),并返回任意类型的值(由=> any表示)。这是ReturnType能够工作的前提,即它只能用于函数类型。

  • 条件类型:T extends (...args: any[]) => infer R ? R : any
    条件类型允许TypeScript根据某个条件来解析类型。在这个例子中,条件是T(一个函数类型)是否可以被视为一个具有特定签名(即接受任意参数并返回某个值的函数)的类型。如果T满足这个条件(实际上,由于泛型约束,它总是满足的),那么TypeScript将使用infer关键字来推断出函数的返回类型,并将其赋值给R。然后,条件类型的“真”分支(即?后面的部分)就是R,即函数的返回类型。

如果T不满足条件(但实际上由于泛型约束,这种情况不会发生),则条件类型的“假”分支(即:后面的部分)将被使用,这里是any。但在ReturnType的定义中,由于有泛型约束,所以“假”分支实际上永远不会被执行。

  • 类型别名:type ReturnType<...> = ...
    最后,整个表达式被定义为一个类型别名ReturnType,它接受一个泛型参数T,并返回该函数的返回类型。

在TypeScript中,infer R表示在条件类型(conditional types)中引入的一个待推断的类型变量。这个变量R用于在条件类型的真实分支中引用,以推断出待推断的类型。infer是TypeScript 2.8及以后版本中引入的一个关键字,它允许在条件类型中进行类型推导,从而实现更灵活和可复用的类型定义。

具体来说,当在extends子句中使用infer时,infer R(其中R可以是任意标识符)用于从满足某个条件的类型中推断出具体的类型。

标签:TypeScript,函数,TS,类型,Vue,ReturnType,any
From: https://www.cnblogs.com/moqiutao/p/18426345

相关文章

  • 【TS】TypeScript基础入门篇以及实践案例
    Array和Tuple//最简单的方法是使用「类型+方括号」来表示数组:letarrOfNumbers:number[]=[1,2,3,4]//数组的项中不允许出现其他的类型://数组的一些方法的参数也会根据数组在定义时约定的类型进行限制:arrOfNumbers.push(3)arrOfNumbers.push('abc')//报错//元......
  • 2024/09/22:TypeScript 学习笔记二
    1、类型注解在TypeScript中,可以使用类型注解来明确标识类型。如:constgreeting:string='helloworld' 2、类型检查静态类型检查:在程序编译时进行——(两种静态类型检查模式:非严格类型检查【默认方式】;严格类型检查)动态类型检查:在程序运行时进行3、TypeScri......
  • 从规范到实现解读Windows平台如何播放RTSP流
    RTSP播放器应用场景RTSP播放器在视频监控、远程视频会议、网络电视、实时流媒体传输、协同操控相关的智能设备、教育培训以及企业内部通讯与协作等多个领域都有着广泛的应用场景。1.视频监控RTSP直播播放器在视频监控系统中扮演着重要角色。通过RTSP协议,播放器可以实时接收来自监......
  • 知其然知其所以然-以视频播放器为例解读RTSP协议的作用
    技术背景好多开发者在用大牛直播SDK的RTSP播放器模块的时候,希望知其然知其所以然,以便跟甲方沟通的时候,底气更足。本文从RTSPsession建立开始,详细解读RTSP播放器的实现原理。RTSP播放器应用场景RTSP播放器具有以下一些主要的使用场景:一、监控领域视频监控系统:在企业、学校、公共场......
  • 【TS】加深TS理解的开发实战示例代码
    TS接口开发实战:基于类类型接口设计实现日期时间应用interfaceITimeDate{curTime:Date;setTime(cur:Date):void;getTime():Date;}classCTimeimplementsITimeDate{curTime:Date;constructor(cur:Date){this.curTime=cur;......
  • 代码实践!如何使用CAMEL Agents构建 GraphRAG ?
    关注公众号:青稞AI,第一时间学习最新AI技术......
  • [机器人仿真]WEBOTS中创建轮腿机器人模型-并联闭环机构的创建和使用
    想着做个轮腿的机器人玩玩,但是如果光用PID做算法,对于轮子加腿的结构似乎效果并不好,为了实现轮腿本身能够飞坡在一定高度下能够跳跃,我想着上个仿真模型来调试和学习LQR算法机器人仿真的软件似乎挺多,我查到比较常用的有ROS套件的一个,还有就是webots本着界面简单,开源(还有校园网方便......
  • [CVPR2024]DeiT-LT Distillation Strikes Back for Vision Transformer Training on L
    在长尾数据集上,本文引入强增强(文中也称为OOD)实现对DeiT的知识蒸馏的改进,实现尾部类分类性能的提升。动机ViT相较于CNN缺少归纳偏置,如局部性(一个像素与周围的区域关系更紧密)、平移不变性(图像的主体在图像的任意位置都应该一样重要)。因此需要大型数据集进行预训练。长尾数据学习......
  • 开放食物营养库python SDK套件:openfoodfacts-python
    官网源码:GitHub-openfoodfacts/openfoodfacts-python:......
  • Android轻量级RTSP服务使用场景分析和设计探讨
    技术背景好多开发者,对我们Android平台轻量级RTSP服务模块有些陌生,不知道这个模块具体适用于怎样的场景,有什么优缺点,实际上,我们的Android平台轻量级RTSP服务模块更适用于内网环境下、对并发要求不高的场景,实现低成本、低延迟的音视频实时传输。本文就上述问题,做个技术探讨,先说......