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

通过条件类型上的泛型传递联合将赋值any而不是联合

,是指在 TypeScript 中使用条件类型和泛型来实现根据条件选择不同的类型,并将其赋值给一个变量,而不是使用联合类型。

在 TypeScript 中,条件类型可以根据一个条件表达式的结果来选择两种不同的类型。泛型则允许我们在定义函数、类或接口时使用参数化类型,以增加代码的灵活性和重用性。

当我们想要根据条件选择不同的类型,并将其赋值给一个变量时,可以使用条件类型上的泛型。通过将泛型参数设置为联合类型,然后在条件类型中使用该泛型参数,我们可以根据条件选择不同的类型,并将其赋值给变量。

下面是一个示例:

代码语言:txt
复制
type IsString<T> = T extends string ? true : false;

function processValue<T>(value: T): IsString<T> extends true ? string : any {
  if (typeof value === 'string') {
    return value;
  }
  return any;
}

const result = processValue('Hello'); // result 的类型为 string

在上面的示例中,我们定义了一个条件类型 IsString<T>,它根据泛型参数 T 是否为 string 类型来选择返回 truefalse。然后,我们定义了一个函数 processValue,它接受一个参数 value,并根据 IsString<T> 的结果选择返回 stringany 类型。最后,我们调用 processValue 函数,并将 'Hello' 作为参数传递给它,得到的 result 变量的类型为 string

这种通过条件类型上的泛型传递联合将赋值 any 而不是联合的技巧可以在某些情况下提供更精确的类型推断和类型安全性。

腾讯云相关产品和产品介绍链接地址:

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

相关·内容

如何进阶TypeScript功底?一文带你理解TS中各种高级语法

关于如何解释,我看到最好一句话概括把明确类型工作推迟到创建对象或调用方法时候才去明确特殊类型,简单点来讲我们可以理解成为把类型当作参数一样去传递。...其次我们在 MyParameters 内部对于 传入参数进行了条件判断,如果满足条件也就是 T extends ( ...args: infer R ) => any,需要注意条件判断中函数参数并不是类型定义时就确认...但是我们清楚类型声明为 any 之后会跳过任何类型检查,比如这样: let myName: any; myName = 1 // 这明显是一个bug myName() unknown 和 any...比如: // 在不确定函数参数类型时 // 函数参数声明为unknown类型而非any // TS同样会对于unknown进行类型检测,any就不会 function resultValueBySome...any 和 unknown 都代表任意类型,但是 unknown 只能接收任意类型值, any 除了可以接收任意类型值,也可以赋值给任意类型(除了 never)。 比如下面这样: let a!

1.9K10
  • TS 进阶 - 类型系统

    条件类型绝大部分场景下会和一起使用,参数实际类型会在实际调用时才会被填充,条件类型在这基础,可以基于填充后参数做进一步类型操作: type LiteralType = T extends...// 因为两个参数都引用了参数 T,因此会被填充为一个联合类型 universalAdd(1, 2); // T 填充为 1 | 2 universalAdd('Cell', '2022');...// 是否通过参数传入 type Condition = T extends 1 | 2 | 3 ?...: 类型参数需要是一个联合类型 类型参数需要通过参数方式传入,不能直接进行条件类型判断 条件类型参数不能被包裹 条件类型分布式特性作用: 联合类型拆开,每个分支分别进行一次条件类型判断...,再将最后结果合并起来 或者说对于属于裸类型参数检查类型条件类型会在实例化时期自动分发到联合类型类型参数指参数是否完全裸露 # IsAny 与 IsUnknown type IsAny

    1.2K50

    TS 从 0 到 1 - 进阶

    但这个函数并不是可以扩展或通用。 虽然可以使用 any 解决通用性问题,但那就失去了定义应该返回那种类型能力,并且也使编译器失去了类型保护作用。...# 使用时机 当函数、接口或类处理多种数据类型时(为了通用) 当函数、接口或类在多个地方使用该数据类型时(为了一致) # 约束 约束用于限制每个类型变量接受类型数量。...# 确保属性存在 有时,希望类型变量对应类型存在某些属性,除非显式地特定属性定义为类型变量,否自编译器不会知道这些属性是否存在。...,只要它指定了默认类型 # 条件类型 条件类型可以根据某些条件得到不同类型,这里条件类型兼容性约束。...: T[P]; } // 通过 keyof T 拿到 T 所有属性名 // 然后使用 in 进行遍历,值赋给 P // 最后通过 T[P] 取得相应属性值 // 中间 ?

    72520

    一文看懂TypeScript工具类型

    类型声明时候可以是多个,可以给默认值,有默认值参数是可选参数,可选参数需要放在定义后端。...U默认值是T也就是boolean 约束 约束是在类型参数上定义一个约束条件,从而限制了实际类型最大范围,这个类型参数约束条件就是约束,语法采用了 extends 关键字,类似于类继承...约束条件有点特殊,它可以引用列表中其他类型,但是不能循环引用。...除了用在函数上还可以用在类和类型别名。...联合类型赋值时候是相联合类型综合。子类型与父类型联合结果是父类型,任何类型与never联合是任何类型。对于类、接口等对象联合,可赋值是其中任意一个,但访问只能访问所有类型共有属性和方法。。

    16710

    TypeScript 官方手册翻译计划【九】:类型操控-条件类型

    但如果把条件类型结合使用,那它就能发挥巨大威力了。...就像使用类型保护实现类型收缩可以得到一个更具体类型一样,条件类型真分支可以通过我们检查类型进一步地去约束。...举个例子,在上面的 Flatten 函数中,我们可以直接推断出数组元素类型不是通过索引访问“手动”提取出元素类型: type Flatten = Type extends Array...Item : Type; 这里,我们使用 infer 关键字声明式地引入了一个新类型变量 Item,不是在真分支中指定如何提取出 T 数组元素类型。...条件类型作用于时,如果给定一个联合类型,那么这时候条件类型是可分配

    80420

    TypeScript另一面:类型编程

    可以看到通常条件类型通常是和一同使用,联想到使用场景,我想你应该明白了些什么。...~ 分布式条件类型实际不是一种特殊条件类型,而是其特性之一。...val; 是不是还挺有用?这应该是我日常用最多类型别名之一了。 也可以在 in 关键字加持下,进行更强力类型判断,思考下面这个例子,要如何 " A | B " 联合类型缩小到"A"?...这里实际使用到了分布式条件类型特性,假设 Exclude 接收 T U 两个类型参数,T 联合类型类型会依次与 U 类型进行判断,如果这个类型参数在 U 中,就剔除掉它(赋值为 never) type...尾声 在结尾说点我个人理解吧,我认为 TypeScript 项目实际是需要经过组织不是这一个接口那一个接口,这里一个字段那里一个类型别名,更别说明明可以使用几个工具类型轻松得到结果却自己重新写了一遍接口

    1.7K20

    深入理解 TypeScript 中 Keyof 运算符,让你代码更安全、更灵活!

    T 类型。...类型安全配置对象: 当我们处理配置对象时,可以使用 keyof 来确保配置项名称是预定义有效值。 通过在对象类型使用 keyof 运算符,我们可以创建联合类型,从而确保属性访问类型安全性。...通过使用 keyof stringMapDemo,我们确保传递 property 是一个字符串类型键。 六、使用 KeyOf 条件映射类型 条件类型用于根据条件表达式在两个声明类型之间进行选择。...我们使用 OptionsFlags 来定义新类型 Features。通过条件映射,Features 类型方法保持不变,字符串属性被映射为 boolean 类型。...在本文中,我们探讨了如何在 TypeScript 、映射类型、显式键、索引签名、条件映射类型和实用类型中使用 keyof 运算符。

    18310

    深入浅出TypeScript | 青训营笔记

    然后用 value1 和 value2 分别赋值为数字和字符串,都是合法。但是尝试 value3 赋值为布尔值时,会得到一个类型错误。 3.... 1. 什么时候需要 2. 是什么 (Generics)是一种参数化类型机制,可以让我们在定义函数、类和接口时,使用一个或多个类型作为参数来指定其返回值或成员类型。...就是临时占个位置, 之后通过传递过来参数进行推导 使用时,我们需要在函数、类或接口名称后面加上尖括号 ,其中 T 代表类型参数名。...需要注意是,在使用时,我们还可以对类型参数进行约束,以限制它们只能是某个特定类型或其子类型。...// 生成单个 soucemaps 文件,不是 sourcemaps 生成不同文件 "inlineSources": true, // 代码与 sourcemaps

    8110

    了不起 TypeScript 入门教程

    支持模块、和接口 不支持模块,或接口 支持 ES3,ES4,ES5 和 ES6 等 不支持编译其他 ES3,ES4,ES5 或 ES6 功能 社区支持仍在增长,而且还不是很大 大量社区支持以及大量文档和解决问题支持...通过 any 类型改变为 unknown 类型,我们已将允许所有更改默认设置,更改为禁止任何更改。...相比于使用 any 类型,使用来创建可复用组件要更好,因为会保留参数类型。...5.extends 有时候我们定义不想过于灵活或者说想继承某些类等,可以通过 extends 关键字添加约束。...// 生成单个 soucemaps 文件,不是 sourcemaps 生成不同文件 "inlineSources": true, // 代码与 sourcemaps

    7K52

    类型体操:探究 TypeScript 内置高级类型

    引入了 ,让类型也能成为参数了。...于是,TypeScript 在基础,又提供了 类型编程,通过一些语法,我们可以拿到 T 下更细粒度类型,或通过判断拿到其他类型。 这个也被大家戏称为 类型体操。...总结一下,从类型能力增强过程来说,就是: 基本类型 -> -> 类型编程(类型体操) TypeScript 内置高级类型 TS 代码版本为 4.8.2 下面我们来看一下 TypeScript...如果不是 string 子类,编译无法通过。 还有一种是 extends ? : 类似 JS 中三元运算符语法,它在等号右侧,用于实现条件判断。...如果 extends 条件判断是继承关系,那么变量 R 就会被赋值函数返回值。 后面的判断为真的分支(? 后面的表达式)就能拿到这个 R。判断为假分支就无法拿到,因为匹配失败了。

    83710

    TypeScript基础常用知识点总结

    但要注意TS并不是去替换JS,它是在JS基础构建。...)任意值类型 任意值(Any)用来表示允许赋值为任意类型,用any来表示任意类型,声明为 any 变量可以赋予任意类型值。...如果定义时候没有赋值,不管之后有没有赋值,都会被推断成 any 类型完全不被类型检查: //下面就不会报错 let myFavoriteNumber; myFavoriteNumber = 'seven...TypeScript— 是指在定义函数、接口或类时候,不预先指定具体类型,而在使用时候再指定类型一种特性。...TypeScript 命名空间可以代码包裹起来,只对外暴露这个命名空间对象,通过 export 关键字命名空间内变量挂载到命名空间对象

    4.8K30

    TypeScript基础(三)扩展类型-接口和类型兼容性

    通过 & 运算符可以现有的多种类型叠加到一起成为一种类型,它包含了所需所有类型特性。...函数兼容性:如果一个函数需要传递一个参数,并且该参数需要满足某些条件,那么可以传递满足这些条件任意函数作为参数。...类型参数:如果一个类型使用了另一个类型作为其类型参数,并且这两个类型之间满足某些条件,那么它们是兼容。...> = numberContainer; // 兼容,因为Container可以接受任意类型值总结起来,TypeScript类型兼容性允许在一定条件下进行赋值和函数参数传递,使得代码更加灵活和易于维护...它可以通过尖括号语法或as语法进行表示,并且只在编译时起作用。使用类型断言时需要注意确保被断言值具备所需属性和方法,并且在对联合类型进行断言时要谨慎处理。

    30040

    1.8W字|了不起 TypeScript 入门教程(第二版)

    通过 any 类型改变为 unknown 类型,我们已将允许所有更改默认设置,更改为禁止任何更改。...相比于使用 any 类型,使用来创建可复用组件要更好,因为会保留参数类型。 12.1 语法 对于刚接触 TypeScript 读者来说,首次看到 语法会感到陌生。...图中 内部 T 被称为类型变量,它是我们希望传递给 identity 函数类型占位符,同时它被分配给 value 参数用来代替它类型:此时 T 充当类型不是特定 Number 类型...其中 T 代表 Type,在定义时通常用作第一个类型变量名称。但实际 T 可以用任何有效名称代替。...5.extends 有时候我们定义不想过于灵活或者说想继承某些类等,可以通过 extends 关键字添加约束。

    10.2K51

    TypeScript笔记

    支持与 JS 共存 动态类型:数据类型不是在编译阶段决定,而是在运行阶段决定 静态类型:数据类型是在编译期间或运行之前确定,即编写代码时需要定义变量类型。...(demo,实际使用应该不会只限制成字符串这种) 2.5.6 参数默认 type IGetRepeatArr = (target: T) => T[]; 2.6 其他类型...// 空类型,表示勿赋值 type IEmptyFunction = () => void; // 任意类型,是所有类型类型 type IAnyArr = any; // 枚举类型:支持枚举值到枚举名正反映射...高级类型 3.1 联合/交叉类型 首先,假设一个情景,你有收藏书籍兴趣,但是只收藏历史书和故事书,而且历史书需要记录历史范围,故事书则是需要记录主题。...为书籍列表编写类型(如下图所示):可以发现类型声明繁琐,存在较多变量 通过联合/交叉类型可以实现优化 联合类型:IA | IB,表示一个值可以是 IA 类型或 IB 类型 交叉类型:IA & IB,多种类型叠加成一种类型

    36430

    一篇文章搞懂TypeScript

    会跳过类型检查,和我们平时写js一样 unknown:未知类型,是一切类型类型,但不是一切类型类型。...,因为只能赋值为 undefined 和 null(只在 --strictNullChecks 未指定时) never:不存在值类型 any、unknonwn是所有类型类型,null、undefined...,应该定义具体属性类型通过 interface 接口定义类型,才能进行属性读取、赋值操作。...(x + y) : x } add(10) add(10, 12) 字面量 这个用来变量值限制成预定,是对值得限定,看着有点像联合类型(是对类型得限定) let a: 10 | 'zhou' |...) 相当于一个占位符,可以理解成函数参数,使用时候传进来是什么,在内部就可以用用占位符去使用,一般多用于函数中,使用时用一对尖括号加上占位符,多用字母 T 占位。

    13510
    领券