首页
学习
活动
专区
工具
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函数基本类型泛型接口类内置对象

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

7.3K31

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基础(一)基本类型与类型运算

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

    24030

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

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

    2.1K10

    深入浅出TypeScript | 青训营笔记

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

    8410

    初识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 对象的返回值类型。

    73520

    TypeScript 基础语法是什么样的?

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

    22410

    TypeScript基础常用知识点总结

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

    4.9K30

    深入浅出 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的类型兼容性允许在一定条件下进行赋值和函数参数传递,使得代码更加灵活和易于维护。

    31640

    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.5K20

    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
    领券