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

如何编写泛型以返回arg A(如果未定义)和arg B(如果A未定义

泛型是一种在编程中使用的技术,它允许我们编写可以适用于多种数据类型的代码。在某些情况下,我们可能需要编写一个泛型函数或类来返回两个参数A和B,其中A是可选的,如果未定义,则返回参数B。

下面是一个示例的泛型函数,用于实现上述需求:

代码语言:txt
复制
function getValues<A, B>(argA?: A, argB: B): A | B {
  if (argA !== undefined) {
    return argA;
  }
  return argB;
}

这个函数使用了 TypeScript 的泛型语法。<A, B> 表示这是一个泛型函数,argAargB 是函数的参数,AB 是泛型类型参数。

函数体内部使用了条件判断,如果 argA 已定义,则返回 argA,否则返回 argB。返回类型使用了联合类型 A | B,表示返回值可以是 A 类型或 B 类型。

这个泛型函数可以适用于各种数据类型,例如:

代码语言:txt
复制
const result1 = getValues<number, string>(10, "Hello"); // 返回 10
const result2 = getValues<string, number>("World", 20); // 返回 "World"
const result3 = getValues<boolean, boolean>(undefined, true); // 返回 true

在腾讯云的产品中,没有直接与泛型相关的产品或服务。然而,腾讯云提供了丰富的云计算解决方案,包括云服务器、云数据库、云存储等,可以满足各种应用场景的需求。你可以通过访问腾讯云官方网站(https://cloud.tencent.com/)了解更多关于腾讯云的产品和服务。

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

相关·内容

TypeScript 学习笔记(一)

编译语言:编译为 js 后运行,单独无法运行; 强类型语言; 面向对象的语言; 优势 类型系统实际上是最好的文档,大部分的函数看看类型的定义就可以知道如何使用; 可以在编译阶段就发现大部分错误...id person2.id = 1; // => 编译报错:id为只读, 不可修改 函数类型接口 // 只有参数列表返回值类型的函数定义, 参数列表里的每个参数都需要名字类型 interface...在函数内部使用变量的时候,由于事先不知道它是哪种类型,所以不能随意的操作它的属性或方法 获取一个参数的长度: function getLength(arg:T):T { console.log...(arg.length) // error: Property 'length' does not exist on type 'T' return arg; } 上例中, T 不一定包含属性...length,所以编译的时候报错了,这时候就可以使用约束,使用 extends 约束 必须符合 Ilength 的形状,也就是必须包含 length 属性: interface Ilength

2.7K10

C#7.3 新增功能

可以使用其他约束。 对现有功能进行了以下增强: 可以使用元组类型测试 == !=。 可以在多个位置使用表达式变量。 可以将属性附加到自动实现的属性的支持字段。...有关详细信息,请参阅有关 ref 返回 ref 局部变量以及 foreach 的文章。...有关详细信息,请参阅有关 where 约束类型参数的约束的文章。 将这些约束添加到现有类型是不兼容的更改。 封闭式类型可能不再满足这些新约束的要求。...此版本添加了三个新规则,帮助编译器选取明显的选择: 当方法组同时包含实例和静态成员时,如果方法在不含实例接收器或上下文的情况下被调用,则编译器将丢弃实例成员。...当一个方法组包含类型参数不满足其约束的某些方法时,这些成员将从候选集中移除。 对于方法组转换,返回类型与委托的返回类型不匹配的候选方法将从集中移除。

1.6K10
  • 一个printf(结构体指针)引发的血案

    为什么写这篇文章 在上周六,我在公众号里发了一篇文章:C语言指针-从底层原理到花式技巧,用图文代码帮你讲解透彻,直白的语言、一目了然的图片来解释指针的底层逻辑,有一位小伙伴对文中的代码进行测试,发现一个比较奇怪的问题...如果改成字符串,打印时是否也会跨过4个字节,于是把测试代码改成下面这样: typedef struct _B{ int a; char b[12];}B; int main(){ B...但是事情好像还没有结束,我们都知道:在调用系统中的 printf 语句时,传入的参数个数类型不是固定的,那么 printf 中是如何来动态侦测参数的个数类型的呢?...比如:如果格式化字符串是 %d,那么就从可变参数中提取一个 int 的数据,如果格式化字符串是 %c,就从可变参数中提取一个 char 数据; 数据处理结束后,使用 va_end 来释放 arg 变量...---- 推荐阅读 [1] C语言指针-从底层原理到花式技巧,用图文代码帮你讲解透彻 [2] 一步步分析-如何用C实现面向对象编程 [3] 原来gdb的底层调试原理这么简单 [4] 生产者消费者模式中的双缓冲技术

    87520

    一个printf(结构体指针)引发的血案

    为什么写这篇文章 在上周六,我在公众号里发了一篇文章:C语言指针-从底层原理到花式技巧,用图文代码帮你讲解透彻,直白的语言、一目了然的图片来解释指针的底层逻辑,有一位小伙伴对文中的代码进行测试,发现一个比较奇怪的问题...现在测试的结构体中有 2 个变量:age name,我们继续简化,只保留 int 数据,这样更容易简化问题。...如果改成字符串,打印时是否也会跨过4个字节,于是把测试代码改成下面这样: typedef struct _B { int a; char b[12]; }B; int main() {...但是事情好像还没有结束,我们都知道:在调用系统中的 printf 语句时,传入的参数个数类型不是固定的,那么 printf 中是如何来动态侦测参数的个数类型的呢?...比如:如果格式化字符串是 %d,那么就从可变参数中提取一个 int 的数据,如果格式化字符串是 %c,就从可变参数中提取一个 char 数据; 数据处理结束后,使用 va_end 来释放 arg 变量

    68920

    React实战精讲(React_TSAPI)

    可以直接在浏览器中使⽤ ⽀持模块、接⼝ 不⽀持或接⼝ ---- 典型 TypeScript ⼯作流程 在上图中包含 3 个 ts ⽂件:a.ts、b.ts c.ts。...这样⽤户就可以⾃⼰的数据类型来使⽤组件。 ❝设计的「关键⽬的」是在「成员之间提供有意义的约束」,这些成员可以是:类的实例成员、类的⽅法、函数参数函数返回值。...下⾯我们来举⼏个例⼦,介绍⼀下如何使⽤约束。 确保属性存在 有时候,我们希望「类型变量对应的类型上存在某些属性」。这时,除⾮我们显式地将特定属性定义为类型变量,否则编译器不会知道它们的存在。...---- 箭头函数在jsx中的语法 在前面的例子中,我们只举例了如何定义常规的函数语法,而不是ES6中引入的箭头函数语法。...如何解决context的值可能是未定义的情况呢。我们针对context的获取可以使用一个「自定义的hook。」

    10.4K30

    什么是TS类型保护、

    在这个例子中,x is Dog 是一个类型保护,它告诉TypeScript编译器,如果 isDog 函数返回 true,那么 x 一定是 Dog 类型。...这通常是通过编写一个返回类型保护签名的函数来实现的type Fish = { swim: () => void; };type Bird = { fly: () => void; };function...通过使用,可以创建可重用的组件,这些组件可以适应多种数据类型,而无需为每种数据类型都重新编写代码。1、定义是通过在类型或函数名后面添加尖括号()类型参数来定义的。...类型推断在调用型函数或实例化类时,TypeScript编译器会尝试根据提供的参数来推断类型参数。如果编译器无法推断出类型参数,可能需要显式地指定它们。...(b); // 输出: [42, 42, 42]数组可以与数组一起使用,创建可以包含任何数据类型的数组。

    6110

    分享 30 道 TypeScript 相关面的面试题

    例如,如果函数接受字符串和数字作为参数,则可以将其键入为 function example(arg: string | number)。这确保了功能的灵活性,同时,仍然保持类型安全。...09、为什么在 TypeScript 中至关重要?它们如何发挥作用? 答:允许创建灵活且可重用的组件,而无需牺牲类型安全性。...它们充当未来类型的占位符,让您可以编写适用于多种类型的函数、类或接口。通过利用,开发人员可以确保各种数据的类型安全,而无需编写冗余代码。...对于组件属性状态,可以定义 TypeScript 接口或类型。 React.FC 类型通常用于定义功能组件的类型,为 props、默认 props 其他 React 特定功能提供强类型。...如果任何引用为 null 或未定义,则表达式会与未定义的值短路。 空合并运算符 (??) 是一个逻辑运算符,当其左侧操作数为空或未定义返回其右侧操作数,否则返回其左侧操作数。

    75530

    SPI框架实现之旅三:实现说明

    获取spiLoader对象 SpiLoader 是一个对象,每个SPI接口,对应一个SpiLoader 对象,我们提供了一个静态方法来获取这个对象 实现 优先从缓存中获取, 如果缓存没有,则新建一个...静态使用 静态使用方式,表示根据传入的条件,选择一个满足条件的实现返回 实现 /** * 根据传入条件, 选择具体的spi实现类 * * 这里要求conf的类型选择器的参数类型匹配, 否则会尝试使用默认的选择器补救...} else { methodImplName = spiConf.name(); } // 优先级, 最小的为准...{ throw new java.lang.RuntimeException(e); } } } 上面给出了一个代理类的演示,那么剩下两个问题,一个是如何生成代理类...; 一个是如何运行代理类(上面是java代码,我们知道运行得是字节码才行) 代理类生成 对着上面的实现,反推代码生成,其实比较简单了,无非就是生成一大串的String罢了,这里真没什么特殊的,贴下实现,

    1.1K100

    论文导读 | Rudra : 查找 Rust 生态系统中的内存安全 Bug

    Safe Unsafe 的分离,可以让我们区分出谁为安全漏洞负责。Safe Rust 意味着,无论如何都不可能导致未定义行为。...定义4:如果 在 safe-value(arg(F))集合中存在v (记为:∃ ∈ safe-value(())),使得当调用 F(v)时触发违反内存安全的行为,或者返回一个不属于safe-value(...宏内部,调用了.borrow()方法,如果第二次转换第一次不一样,而会返回一个未初始化字节的字符串。...这里, Borrow 是高阶类型,它内部 borrow 的一致性其实并没有保证,可能会返回不同的slice,如果不做处理,很可能会暴露出未初始化的字节给调用者。...论文对此给出定义: 如果在实现Send/Sync类型时,如果它对内部类型上指定了不正确的Send/Sync约束,那么的Send/Sync约束就会变得不正确。

    95420

    TypeScript手记(五)

    在像 C# Java 这样的语言中,可以使用来创建可重用的组件,一个组件可以支持多种类型的数据。这样用户就可以自己的数据类型来使用组件。...arg } 你可以这样理解 loggingIdentity 的类型:型函数 loggingIdentity,接收类型参数 T 参数 arg,它是个元素类型是 T 的数组,并返回元素类型是T 的数组...如果我们传入数字数组,将返回一个数字数组,因为此时 T 的的类型为 number。这可以让我们把变量 T 当做类型的一部分使用,而不是整个类型,增加了灵活性。...类型 我们创建了 identity 通用函数,可以适用于不同的类型。在这节,我们研究一下函数本身的类型,以及如何创建接口。...对于描述哪部分类型属于部分来说,理解何时把参数放在调用签名里何时放在接口上是很有帮助的。 除了接口,我们还可以创建类。注意,无法创建枚举命名空间。

    92710

    在 TypeScript 中使用:使用指南

    ,使得编写大型应用的代码发生了变革,它提供了先进的类型特性工具,比如类型接口,(作为最强大的工具之一,用于编写可扩展,可重用组件而不牺牲类型安全性)。...通过使用,我们可以编写函数,这个函数接受任何类型参数并返回相同类型,确保连续性类型安全。...实用类型 utility TypeScript 包含系列实用类型,可以更轻松地使用各种形式转换类型。...在该章节中,我们将讨论使用使用的基本技巧,以及如何避免可能导致复杂错误或降低代码可读性的错误。 命名变量的最佳实践 命名变量应该是直观的,如果可能,应该具有描述性。...合理使用如果怀疑它们对我们的工作流程有害,我们需要对编译时间进行基准测试。 当对我们代码的重用性类型安全有帮助,那么就应该引用进来。

    13810

    探索类型系统的底层 - 自己实现一个 TypeScript(硬核干货)

    语言编译器是如何工作的?...关于代码转换更详细的介绍,可以参考原作者的这两篇文章 Web Bundler Source Maps。 语言编译器是如何工作的? 对于大多数编译器来说,在某种形式上有三个共同的阶段。 1....我觉得这给出了一个非常强大的 idea,即在如此多的不同场景中检查如此多的不同类型是多么的复杂困难。 类型检查器不依赖于调用代码,即如果一个文件中的任何代码被执行(例如,在运行时)。...每个编译器都必须做出困难的选择,确定哪些内容将被包含,哪些不会被包含。TypeScript 有一些被称为不健全的区域(即需要运行时类型检查)。...我们将其限制在三个场景中的原因是,我们可以关注每一个场景中的具体机制,并希望到最后能够对如何引入更复杂的类型检查有一个更好的构思。 我们将在编译器中使用函数声明表达式(调用该函数)。

    1.2K40
    领券