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

TypeScript:作为函数返回值的条件泛型类型不可赋值

TypeScript是一种由微软开发的开源编程语言,它是JavaScript的超集,为JavaScript添加了静态类型检查和其他特性。在TypeScript中,可以使用泛型来增强代码的灵活性和重用性。

函数返回值的条件泛型类型不可赋值是指在函数的返回值类型中使用条件泛型类型,并且该类型不能被赋值给其他变量或参数。条件泛型类型是一种在泛型中使用条件语句进行类型推断的方式。

例如,考虑以下示例代码:

代码语言:txt
复制
function getValue<T extends string | number>(value: T): T extends string ? string : number {
  return typeof value === 'string' ? value.toUpperCase() : value * 2;
}

const result: string = getValue('hello'); // 错误,无法将返回值类型赋值给string类型的变量

在上述代码中,函数getValue接受一个参数value,该参数的类型是泛型T,并且限制T必须是stringnumber类型。函数的返回值类型使用了条件泛型类型,根据T的类型进行条件判断,如果Tstring类型,则返回string类型,否则返回number类型。

然而,尝试将函数的返回值赋值给类型为string的变量result时,会导致类型错误。这是因为条件泛型类型不可赋值给其他类型,即使在这种情况下,我们知道返回值的类型是string

解决这个问题的一种方法是使用类型断言来告诉编译器我们知道返回值的类型,例如:

代码语言:txt
复制
const result: string = getValue('hello') as string;

在这种情况下,我们使用类型断言将返回值强制转换为string类型,这样就可以将其赋值给result变量。

总结:

  • TypeScript是一种由微软开发的开源编程语言,为JavaScript添加了静态类型检查和其他特性。
  • 函数返回值的条件泛型类型不可赋值是指在函数的返回值类型中使用条件泛型类型,并且该类型不能被赋值给其他变量或参数。
  • 使用类型断言可以解决将条件泛型类型赋值给其他类型的问题。
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

TypeScript 基本类型使用

例如, never类型是那些总是会抛出异常或根本就不会有返回值函数表达式或箭头函数表达式返回值类型; 变量也可能是 never类型,当它们被永不为真的类型保护所约束时。...推断返回值类型为never function fail() { return error("Something failed"); } // 返回never函数必须存在无法达到终点 function...infiniteLoop(): never { while (true) { } } 复制代码 typescript 先来谈谈使用场景 模拟一个场景,当我们要使用一个服务器提供不同数据...正解: 使用 typescript (Generic) 先简单来说一下什么是? ==就是表示一个类型变量,用他来代替某个实际类型用于编程。...可以看到我们在推导类型返回值类型时候,vscode 会提示你对应 string 和 number类型

2.5K40

初探 TypeScript函数基本类型接口类内置对象

{ return x + y } //匿名函数 复制代码 我们只对代码右侧匿名函数进行了类型定义,而等号左边 myAdd 是通过赋值操作进行类型推断出来,书写完整函数类型。...: 参数类型返回值类型;在 TypeScript 类型定义中, => 用来表示函数定义,左边是输入类型,需要用括号括起来,右边是输出类型,和 ES6 箭头函数不一样 可选参数和默认参数 TypeScript...let myIdentity1:{ (arg:T):T} = identity 复制代码 可以使用带有调用签名对象字面量来定义函数,我们可以将对象字面量拿出来作为一个接口,将一个参数当做整个接口一个参数...new GeneriNumber() 复制代码 类有两个部分:静态部分和实例部分,类指实例部分,所以静态属性不能使用这个类型,定义接口来描述约束条件 约束 interface...;他有一个调用签名,参数列表和返回值类型函数定义,参数列表里每一个参数都需要名字和类型函数参数名不需要与接口里定义名字相匹配,如果你没有指定参数类型TypeScript 类型系统会推断出参数类型

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

    换句话说接口本身不需要,而在实现使用接口代表函数类型时需要声明该函数接受一个参数。...在使用 isString 时,你可以为它传入任意类型作为参数实现。...同时我们定义了一个函数,它接受一个 cb 回调参数作为参数,我们定义了这个回调函数类型为接受一个 param 为 Son 实例类型参数,此时我们不关心它返回值给一个 any 即可。...string|number|boolean 赋给 string 类型 这里,函数类型赋值兼容时函数返回值就是典型协变场景,我们可以看到 fn1 函数返回值类型规定为 string,fn2 返回值类型规定为...我们一起来看看 infer 实际用法。 在 TS 中存在一个内置类型 Parameters ,它接受传入一个函数类型作为参数并且会返回这个函数所有的参数类型组成元祖。

    1.9K10

    TypeScript基础(一)基本类型类型运算

    ; } never类型:通常用于约束函数返回值,表示该函数永远不可能结束 function throwError(message: string): never { throw new Error(...约束(Generic Constraints) 使用 extends 关键字对进行约束,限制参数必须满足某些条件。...通过约束,我们可以在函数内部使用参数特定属性或方法。 这些类型运算符可以帮助开发者更灵活地操作和组合类型,提供了更强大类型系统支持。...通过使用类型别名,我们可以将复杂类型定义简化为一个易于理解和使用名称。 类型约束 在TypeScript中,函数可以通过参数类型返回值类型函数重载等方式进行约束。...通过参数类型约束、返回值类型约束和函数重载等方式,我们可以在TypeScript中对函数进行更精确约束和定义,以提高代码可读性、可维护性和可靠性。

    22730

    深入浅出TypeScript | 青训营笔记

    TS(TypeScript)是一种由Microsoft开发和维护编程语言,它是JavaScript超集,支持静态类型检查、类、接口、等特性。... 1. 什么时候需要 2. 是什么 (Generics)是一种参数化类型机制,可以让我们在定义函数、类和接口时,使用一个或多个类型作为参数来指定其返回值或成员类型。...就是临时占个位置, 之后通过传递过来参数进行推导 使用时,我们需要在函数、类或接口名称后面加上尖括号 ,其中 T 代表类型参数名。...然后就可以在函数内部或类/接口成员声明中使用这个类型了。 3....使用推断类型方式调用这个函数时,TypeScript 会自动根据传入参数类型推导出类型 T 具体类型

    8110

    初识TypeScript -基础一 (持续更新)

    作为一种解释语言,只能在运行时发现错误 强类型,支持静态和动态类型类型,没有静态类型选项 最终被编译成 JavaScript 代码,使浏览器可以理解 可以直接在浏览器中使用 支持模块、和接口...不支持模块,或接口 社区支持仍在增长,已经初具规模 大量社区支持以及大量文档和解决问题支持 TypeScript使用 通过线上环境学习 线上学习可以不用安装 typescript,而是直接使用...Never类型表示是那些永不存在类型 1、never类型是那些总是会抛出异常或根本就不会有返回值函数表达式或箭头函数表达式返回值类型; 2、never类型是任何类型类型,也可以赋值给任何类型...;any不可赋值给never。...推断返回值类型为never function fail() { return error("Something failed"); } // 返回never函数必须存在无法达到终点 function

    1.1K10

    TypeScript进阶 之 重难点梳理

    name: string // 错误,`name`类型与索引类型返回值类型不匹配 } 当然,我们也可以将索引签名设置为只读,这样就可以防止给索引赋值 interface ReadonlyStringArray...在 ts 中,「extends 关键字既可以来扩展已有的类型,也可以对类型进行条件限定」。在扩展已有类型时,不可以进行类型冲突覆盖操作。...如果不指定类型,就在定义之后指定一个默认类型 myLog(1) 「我们也可以把变量理解为函数参数,只不过是另一个维度参数,是代表类型而不是代表值参数。」...增强程序扩展性 不必写多条函数重载,冗长联合类型声明,增强代码可读性 灵活控制类型之间约束 ,在 ts 内部也都是非常常用,尤其是对于容器类非常常用。...p : T; 在上面的条件语句中,infer P 表示待推断函数参数,如果T能赋值给(param : infer p) => any,则结果是(param: infer P) => any类型参数

    3.9K20

    TS 从 0 到 1 - 进阶

    # 设计是为了在成员之间提供有意义约束,这些成员可以是:类实例成员、类方法、函数参数和函数返回值。...# 使用时机 当函数、接口或类将处理多种数据类型时(为了通用) 当函数、接口或类在多个地方使用该数据类型时(为了一致) # 约束 约束用于限制每个类型变量接受类型数量。...,只要它指定了默认类型 # 条件类型 条件类型可以根据某些条件得到不同类型,这里条件类型兼容性约束。...如,never 类型是那些总是会抛出异常或根本就不会有返回值函数表达式或箭头表达式返回值类型。 没有类型是 never 类型或可以赋值给 never 类型(除了 never 本身)。...利用条件类型和 infer 关键字,还可以方便地实现获取 Promise 对象返回值类型

    72520

    TypeScript 基础语法是什么样

    TypeScript 是一种由微软开发静态类型编程语言,它可以作为 JavaScript 超集使用,并且可以在编译时进行类型检查。...使用 const 声明变量是常量,不可被重新赋值,而且只在块级作用域内有效。...void 类型表示没有返回值函数。never 类型表示永远不会有返回值函数或者总是会抛出异常表达式。unknown 类型表示未知类型值,它比 any 更加严格。...TypeScript 中一种强大类型系统功能,它可以在编译时实现类型安全参数化类型。...总结本文详细介绍了 TypeScript 基础语法,包括变量声明、基本数据类型函数、类、接口、、模块、类型推断、类型断言和装饰器等方面。

    22010

    TypeScript基础常用知识点总结

    TypeScript函数 10. TypeScript类型推论和类型断言 11. TypeScript—枚举 12. TypeScript 13....TypeScript增加功能: 类型批注和编译时类型检查、类型推断、接口、枚举、Mixin、编程、元组、Await、类、模块、lambda 函数箭头语法、可选参数以及默认参数等。...二.TypeScript语法总结 下面开始基础语法总结,涉及到语法有变量声明、基础类型、对象类型、元组、枚举、接口、类、函数、、、字面量类型类型断言、类型保护等等。 1....元组中允许存储不同类型元素,元组可以作为参数传递给函数。...TypeScript 是指在定义函数、接口或类时候,不预先指定具体类型,而在使用时候再指定类型一种特性。

    4.8K30

    深入浅出 TypeScript

    」给予开发者创造灵活、可重用代码能力。 设计关键目的是「在成员之间提供有意义约束」,这些成员可以是:类实例成员、类方法、函数参数和函数返回值。...除了可以在函数中使用,还可以在类中使用,它既可以作用于类本身,也可以作用于类成员函数。...new 默认情况下,不能构造,需要「声明为构造函数」。...类型兼容性 本身就是不确定类型,它表现根据「是否被成员使用而不同」。...值为true或false,指定是否将每个文件作为单独模块,默认为true,它不可以和declaration同时设定 */ /* Strict Type-Checking Options *

    2.9K30

    TS 进阶 - 类型系统

    类型系统与类型检查 类型 限制数据可用操作、意义、允许集合,即访问限制与赋值限制 在 TypeScript 中即原始类型、对象类型函数类型、字面量类型等基础类型,以及类型别名、联合类型等经过类型编程后得到类型...条件类型绝大部分场景下会和一起使用,参数实际类型会在实际调用时才会被填充,而条件类型在这基础上,可以基于填充后参数做进一步类型操作: type LiteralType = T extends...: 类型参数需要是一个联合类型 类型参数需要通过参数方式传入,不能直接进行条件类型判断 条件类型参数不能被包裹 条件类型分布式特性作用: 将联合类型拆开,每个分支分别进行一次条件类型判断...,再将最后结果合并起来 或者说对于属于裸类型参数检查类型条件类型会在实例化时期自动分发到联合类型上 裸类型参数指参数是否完全裸露 # IsAny 与 IsUnknown type IsAny...void 返回值类型函数,并不会要求其什么都不能返回。

    1.2K50

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

    函数接受两个参数 x 和 y,并返回一个数字类型结果。我们可以使用该接口来声明变量 add,并将其赋值为一个函数。...类型兼容性TypeScript类型兼容性是指在类型检查过程中,允许某些类型之间赋值操作或函数参数传递,即使它们具体类型不完全匹配。...函数兼容性:如果一个函数需要传递一个参数,并且该参数需要满足某些条件,那么可以传递满足这些条件任意函数作为参数。...类型参数:如果一个类型使用了另一个类型作为类型参数,并且这两个类型之间满足某些条件,那么它们是兼容。...,TypeScript类型兼容性允许在一定条件下进行赋值函数参数传递,使得代码更加灵活和易于维护。

    30040

    TypeScript基础知识

    类型别名:不仅可以为对象指定类型,实际上可以为任意类型指定别名。但是不能合并声明。 是可以保证类型安全前提下,让函数等与多种类型一起工作,从而实现复用,常用于:函数、接口、类中。...这里这个T,是一种特殊类型变量,它处理类型而不是值。 它就相当于一个类型容器,能够捕获用户提供类型,因为T是类型,因此可以将其作为函数参数和返回值类型,表示参数和返回值具有相同类型。...约束 如图,因为T不一定包含属性length,所以当我们内部使用变量时候,不知道它是那种类型,所以不能操作它属性和方法。...接口 我们可以在定义接口时候指定。 在接口名称后面添加,那么这个接口就变成了接口。...可以为类型参数指定默认类型

    2.2K20

    TypeScript入门

    Lin', sex: 'man', age: 28, hobby: 'swimming', } interface IBytedancer { /* 只读属性:约束属性不可在对象初始化外赋值...,而在使用时候再指定类型一种特性 */ type IGetRepeatArrR = (target: T) => T[]; /* 接口 & amp; 多 */ interface IX...(arg.a1) } else { console.log(arg.b1); } } /* 类型守卫:定义一个函数,它返回值是一个类型谓词,生效范围为子作用域 */...,通过设定对象可选选项,即可自动推导出子集类型 # 函数返回值类型 type IDelayCall = any>(func: T) => ReturnType;...类型 A: 类型 B // 关键字【infer】出现在类型推荐中,表示定义类型变量,可以用于指代类型 // 如该场景下,将函数返回值类型作为变量,使用新 R 表示,使用在类型推荐命中结果中

    1.4K20

    4000字讲清 《深入理解TypeScript》一书 【基础篇】

    this.state.baz = 456; // Error: 你应该使用 this.setState() } } // 创建一个类 class Queue { private...你可以随意调用参数,当你使用简单时,常用 T、U、V 表示。...如果在你参数里,不止拥有一个,你应该使用一个更语义化名称,如 TKey 和 TValue (通常情况下,以 T 作为前缀,在其他语言如 C++ 里,也被称为模板) 变体 对类型兼容性来说,变体是一个利于理解和重要概念...它自然被分配一些例子: 一个从来不会有返回值函数(如:如果函数内含有 while(true) {}); 一个总是会抛出错误函数(如:function foo() { throw new Error...当一个函数没有返回值时,它返回了一个 void 类型,但是,当一个函数根本就没有返回值时(或者总是抛出错误),它返回了一个 never,void 指可以被赋值类型(在 strictNullChecking

    1.9K30
    领券