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

为什么Typescript不能在赋值中使用泛型的keyof类型,并将其泛化为string?

Typescript不能在赋值中使用泛型的keyof类型并将其泛化为string的原因是因为泛型的keyof类型在编译时期是无法确定的,而泛化为string则要求类型是确定的。

在Typescript中,泛型的keyof类型表示一个对象的所有键的联合类型。例如,对于一个类型为T的对象,keyof T表示T对象的所有键的联合类型。然而,由于泛型的keyof类型是在编译时期才能确定的,无法在赋值过程中将其泛化为string类型。

这是因为在赋值过程中,编译器需要确定变量的类型,而将泛型的keyof类型泛化为string类型会导致类型不确定。编译器无法确定泛型的keyof类型到底是哪些键的联合类型,因此无法将其泛化为string类型。

举个例子,假设有一个泛型函数getValue,它接受一个对象和一个键,返回该对象对应键的值。如果我们尝试将泛型的keyof类型泛化为string类型,那么在调用getValue函数时,编译器无法确定传入的键是否存在于对象中,从而无法进行类型检查。

为了解决这个问题,可以使用类型断言或类型守卫来明确指定泛型的keyof类型为string。例如,可以使用类型断言as keyof T来将泛型的keyof类型指定为string,或者使用类型守卫来检查键是否存在于对象中。

总结起来,Typescript不能在赋值中使用泛型的keyof类型并将其泛化为string的原因是因为泛型的keyof类型在编译时期是无法确定的,而将其泛化为string类型会导致类型不确定。为了解决这个问题,可以使用类型断言或类型守卫来明确指定泛型的keyof类型为string。

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

相关·内容

TypeScript进阶 之 重难点梳理

name: string // 错误,`name`的类型与索引类型返回值的类型不匹配 } 当然,我们也可以将索引签名设置为只读,这样就可以防止给索引赋值 interface ReadonlyStringArray...例如,基类型中键a为string,在扩展出的类型中无法将其改为number。...通常我们说,泛型就是指定一个表示类型的变量,用它来代替某个实际的类型用于编程,而后再通过实际运行或推导的类型来对其进行替换,以达到一段使用泛型程序可以实际适应不同类型的目的。...说白了,「泛型就是不预先确定的数据类型,具体的类型在使用的时候再确定的一种类型约束规范」。 泛型可以应用于 function、interface、type 或者 class 中。...>; // string 工具泛型 所谓的工具泛型,其实就是泛型的一些语法糖的实现。

3.9K20

TS 从 0 到 1 - 泛型进阶

// { value: 2022, message: 'hello' } # 泛型类 在类中使用泛型,只要在类名后面,使用 的语法定义任意多个类型变量: interface GenericInterface...# 泛型使用时机 当函数、接口或类将处理多种数据类型时(为了通用) 当函数、接口或类在多个地方使用该数据类型时(为了一致) # 泛型约束 泛型约束用于限制每个类型变量接受的类型数量。...# 泛型参数默认类型 可以为泛型中的类型参数指定默认类型,当使用泛型时没有在代码中直接指定参数类型参数,从实际值参数中无法推断出类型时,这个默认类型就会起作用。...A = { name: 2022 }; 泛型参数的默认类型遵循以下规则: 有默认类型的类型参数被认为是可选的 必选的类型参数不能在可选的类型参数之后 如果类型参数有约束,类型参数的默认类型必须满足约束...; // void type T2 = ReturnType() => T>; // {} # 使用泛型创建对象 # 构造签名 有时,泛型类需要基于传入的泛型 T 来创建其类型相关的对象。

73520
  • 一份TypeScript高级类型入门手册,附大量代码实例,值得收藏

    Generic Types(泛型) 泛型类型是复用给定类型的一部分的一种方式。它有助于捕获作为参数传递的类型 T。 优点: 创建可重用的函数,一个函数可以支持多种类型的数据。...T帮助我们捕获用户传入的参数的类型(比如:number/string)之后我们就可以使用这个类型 我们把 showType 函数叫做泛型函数,因为它可以适用于多个类型 泛型接口 interface GenericType...声明了一个 GenericType 接口,该接口接收泛型类型 T, 并通过类型 T来约束接口内 name 的类型 注:泛型变量约束了整个接口后,在实现的时候,必须指定一个类型 因此在使用时我们可以将name...因此,通过使用Extract,即提取出了新的类型 {id:number}。 Exclude Exclude --从 T 中剔除可以赋值给 U 的类型。...在代码中,它期望一个number作为类型,这就是为什么我们将 0、1 和 2 作为employees变量的键的原因。

    1.5K40

    一份TypeScript高级类型入门手册,附大量代码实例,值得收藏

    Generic Types(泛型) 泛型类型是复用给定类型的一部分的一种方式。它有助于捕获作为参数传递的类型 T。 优点: 创建可重用的函数,一个函数可以支持多种类型的数据。...T帮助我们捕获用户传入的参数的类型(比如:number/string)之后我们就可以使用这个类型 我们把 showType 函数叫做泛型函数,因为它可以适用于多个类型 泛型接口 interface GenericType...声明了一个 GenericType 接口,该接口接收泛型类型 T, 并通过类型 T来约束接口内 name 的类型 注:泛型变量约束了整个接口后,在实现的时候,必须指定一个类型 因此在使用时我们可以将name...因此,通过使用Extract,即提取出了新的类型 {id:number}。 Exclude Exclude --从 T 中剔除可以赋值给 U 的类型。...在代码中,它期望一个number作为类型,这就是为什么我们将 0、1 和 2 作为employees变量的键的原因。

    1.5K30

    TypeScript 中提升幸福感的 10 个高级技巧

    TypeScript 允许我们遍历某种类型的属性,并通过 keyof 操作符提取其属性的名称。...keyof 操作符是在 TypeScript 2.1 版本引入的,该操作符可以用于获取某种类型的所有键,其返回类型是联合类型。...查找类型 + 泛型 + keyof 泛型(Generics)是指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性。...显式泛型 $('button') 是个 DOM 元素选择器,可是返回值的类型是运行时才能确定的,除了返回 any ,还可以 function $(id: string...DeepReadonly 被 readonly 标记的属性只能在声明时或类的构造函数中赋值。 之后将不可改(即只读属性),否则会抛出 TS2540 错误。

    97420

    《现代Typescript高级教程》泛型和类型体操

    " type PersonNameType = Person['name']; // string 在上面的示例中,我们使用 keyof 操作符获取了 Person 接口的属性名集合,并通过索引访问类型获取了...3. infer 关键字 infer 关键字用于在条件类型中推断类型,并将其赋值给一个类型变量。...这个例子结合了泛型、内置泛型函数 Pick、keyof 操作符和 extends 关键字,展示了如何在 TypeScript 中处理复杂的类型操作和转换。...总结 泛型和类型体操是 TypeScript 中强大的类型系统的关键组成部分。通过使用泛型,我们可以创建可重用、灵活和类型安全的代码。...通过结合泛型、extends 关键字、内置泛型函数和其他高级类型概念,我们能够在 TypeScript 中编写更复杂、类型安全的代码,并利用 TypeScript 的强大类型系统来提高代码的可读性、可维护性和可扩展性

    37930

    Typescript 高级用法以及项目实战问题

    本文主要介绍 TypeScript 的高级用法,适用于对 TypeScript 已经有所了解或者已经实际用过一段时间的同学,分别从类型、运算符、操作符、泛型的角度来系统介绍常见的 TypeScript...const dog: Dogstring> = { name: 'ww', type: 'hsq' } // 不可省略string>这部分 如果我们想不指定,可以使用泛型默认值的方案。...function pickkeyof T>(){}; 这里的意思是限制了 U 一定是 T 的 key 类型中的子集,这种用法常常出现在一些泛型工具库中。...类型C: 类型D 泛型推断 infer infer 的中文是“推断”的意思,一般是搭配上面的泛型条件语句使用的,所谓推断,就是你不用预先指定在泛型列表中,在运行时会自动判断,不过你得先预定义好整体的结构...五、泛型工具 Partial 此工具的作用就是将泛型中全部属性变为可选的。 type Partial = { [P in keyof T]?

    1.9K50

    《现代Typescript高级教程》高级类型

    条件类型通常与泛型一起使用,以便根据不同的类型参数值进行类型推断和转换。...infer关键字的作用是告诉 TypeScript 编译器在条件类型中推断一个待定的类型,并将其赋值给声明的类型变量。这使得我们可以在条件类型中使用这个推断出的类型进行进一步的类型操作。...需要注意的是,infer关键字只能在条件类型的右侧使用,用于声明一个待推断的类型变量,而不能在其他地方使用。此外,每个条件类型只能使用一次infer关键字,并且通常与泛型一起使用。...infer关键字是 TypeScript 中用于提取并推断待定类型的工具。它允许我们在条件类型中声明一个类型变量,用于在类型推断过程中捕获和使用待推断的类型,从而使类型系统更加灵活和强大。...在上面的示例中,我们定义了一个模板字面量类型Greeting,它接受一个字符串类型参数T,并使用字符串模板将其包装在Hello,和!之间。

    21730

    一份TypeScript高级类型入门手册,附大量代码实例,值得收藏

    Generic Types(泛型) 泛型类型是复用给定类型的一部分的一种方式。它有助于捕获作为参数传递的类型 T。 优点: 创建可重用的函数,一个函数可以支持多种类型的数据。...T帮助我们捕获用户传入的参数的类型(比如:number/string)之后我们就可以使用这个类型 我们把 showType 函数叫做泛型函数,因为它可以适用于多个类型 泛型接口 interface GenericType...声明了一个 GenericType 接口,该接口接收泛型类型 T, 并通过类型 T来约束接口内 name 的类型 注:泛型变量约束了整个接口后,在实现的时候,必须指定一个类型 因此在使用时我们可以将name...因此,通过使用Extract,即提取出了新的类型 {id:number}。 Exclude Exclude --从 T 中剔除可以赋值给 U 的类型。...在代码中,它期望一个number作为类型,这就是为什么我们将 0、1 和 2 作为employees变量的键的原因。

    96020

    【文末送书】Typescript 使用日志

    Typescript 都有哪些类型 1、Typescript 基本类型,也就是可以被直接使用的单一类型。...传入的参数可以是任何类型,难道我们需要把每个类型都写一遍? •使用函数重载,得把每个类型都写一遍,不适合。•泛型,用一个类型占位 T 去代替,在使用时指定对应的类型即可。...= d2(true); 其实泛型本来很简单,但许多初学 Typescript 的同学觉得泛型很难,其实是因为泛型可以结合索引查询符 keyof、索引访问符 T[k] 等写出难以阅读的代码,我们来看一下。...2、为什么 Typescript 中的函数参数也是协变呢?...泛型中的兼容 泛型中的兼容,如果没有用到 T,则两个泛型也是兼容的。

    2.9K10

    全面解析 TypeScript 泛型的二三事

    在 TypeScript 中,泛型通过在类、接口和函数的声明中引入类型变量来实现。...对于泛型的命名,可以将其命名为任何您想要的名称(只要它不是保留关键字(例如 const、enum)或已导入的类型名称)。一般我们经常使用单个字母来表示泛型,例如 T。...,也是通过 = 来声明一个泛型的默认类型使用默认类型,可以让我们在调用的时候,如果不传递类型给泛型,泛型也能获取到默认类型应用到具体的变量约束上。...infer 在泛型中的应用在泛型中,我们经常会使用 infer 对泛型做进一步的类型推定, 进一步将范围进行缩小,推断到我们想要的类型。...小结泛型作为 ts 中重要的基石的存在,学会了 泛型的使用,可以让我们编写更加健壮且可维护的代码如果这篇文章对你有帮助,欢迎点赞、关注、转发!

    11810

    TypeScript高级类型-Partial

    TypeScript高级类型-Partial 预备知识: TypeScript类型系统 接口 泛型 先来看一下 Partial 类型的定义 /** * Make all properties...希望得到的是由 key, value 组成的新类型 以上对应到 TypeScript 中是如何实现的呢?...keyof keyof,即 索引类型查询操作符,我们可以将 keyof 作用于泛型 T 上来获取泛型 T 上的所有 public 属性名构成的 联合类型 注意:”public、protected、private...---- 总结: 针对高级类型的编写,我们可以尝试将其以 JavaScript 的代码方式表述出来,然后使用 TypeScript 对其进行实现。...在每一个小步骤中遇到不懂的,可以结合最后的结果进行比对(比如本文中 Partial 的类型定义),发现问题点在哪里,然后针对性查证并解决。

    70120

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

    > 代表的是使用接口时需要传入泛型的类型,比如IPerson。...换句话说接口本身不需要泛型,而在实现使用接口代表的函数类型时需要声明该函数接受一个泛型参数。...keyof 关键字 所谓 keyof 关键字代表它接受一个对象类型作为参数,并返回该对象所有 key 值组成的联合类型。...你可以理解为 in 关键字的作用类似于 for 循环,它会循环 keyof IProps 这个联合类型中的每一项类型,同时在每一次循环中将对应的类型赋值给 K 。...,刚刚才提到类型兼容性的原因 TS 允许不同类型进行互相赋值(只需要父/子集关系),那么明明 fn2 的参数包括了所有的 fn1 为什么会报错?

    2.1K10

    你不知道的 TypeScript 泛型(万字长文,建议收藏)

    (容易混淆的 interface 内的小括号) TS 中特有的一些东西 比如 typeof,keyof, infer 以及本文要讲的泛型。...「把这些和 JS 中容易混淆的东西分清楚,然后搞懂 TS 特有的东西,尤其是泛型」(其他基本上相对简单),TS 就入门了。 泛型初体验 在强类型语言中,一般而言需要给变量指定类型才能使用该变量。...如下代码: const name: string = "lucifer"; console.log(name); 我们需要给 name 声明 string 类型,然后才能在后面使用 name 变量,当我们执行以下操作的时候会报错...改成这样是 ok 的: type Lucifer = LeetCode; 泛型为什么使用尖括号 为什么泛型要用尖括号(),而不是别的?...要知道真正的 TS 高手都是玩类型的,高手才不会满足于类型的交叉并操作。泛型用的好确实可以极大减少代码量,提高代码维护性。如果用的太深入,也可能会团队成员面面相觑,一脸茫然。

    3.2K40

    探索TypeScript的映射类型,从简单到高级的7个实例

    keyof 操作符:keyof 是TypeScript中的一个操作符,它返回一个类型的所有属性名的联合类型。...我们将在高级示例中使用 Capitalize 工具类型。 泛型类型(Generic types):泛型类型是创建依赖于另一种类型的类型的方法。例如,Type是一个依赖于 T 的泛型类型。...同样,在TypeScript中,映射类型可以遍历类型的每个属性并对其进行转换。 二、 将类型属性设为可选 在TypeScript中,我们常常需要将某个类型的所有属性设为可选属性。...使用泛型类型实现Partial工具类型 此外,我们还可以通过泛型类型来实现Partial工具类型。这样可以使我们的代码更加通用和复用。...}; 在这个定义中,Key in keyof Type会遍历Type类型的每个属性,通过Capitalize工具类型将属性名的首字母大写,并使用模板字面量类型来生成新的属性名称。

    32310

    TypeScript在项目开发中的应用实践体会

    以及Typescript是否可以解决当前项目生产的困境。 如果对于为什么使用TypeScript产生疑惑,那么可以移步你为什么不使用 TypeScript?,它是一个非常棒的讨论话题。...通过一个简单的案例来进行理解,当泛型T为string类型的时候,那么B为1,反之为2。可以看到同样的一个类型,因为传入的泛型T不一样,结果自然而然的有了出入。 ?...将其定义成enum的标注用于标识状态,如:status === Status.START。 ? image.png 枚举可以看一篇阿宝哥的小文章一文让你彻底掌握 TS 枚举 泛型 ?...image.png 泛型是TypeScript当中必知必会的一个属性,在很多的时候,类型推导在开始时很难进行推倒。相比于使用 any 类型,使用泛型来创建可复用的组件要更好,因为泛型会保留参数类型。...image.png 对于泛型的实践来说,使用是需要一定理解,复杂的泛型使用会非常的复杂。 工具类型 TypeScript当中也提供了一些非常好用的工具类型,能够配合我们更好的使用工具类型。

    2.9K60

    TS 进阶 - 类型系统

    、类型系统与类型检查 类型 限制数据的可用操作、意义、允许的值的集合,即访问限制与赋值限制 在 TypeScript 中即原始类型、对象类型、函数类型、字面量类型等基础类型,以及类型别名、联合类型等经过类型编程后得到的类型...条件类型绝大部分场景下会和泛型一起使用,泛型参数实际类型会在实际调用时才会被填充,而条件类型在这基础上,可以基于填充后的泛型参数做进一步的类型操作: type LiteralType = T extends.../ 'other' 在函数中,条件类型与泛型的搭配也很常见: function universalAddstring>(x: T, y: T...infer 只能在条件类型中使用,因为实际上仍然需要类型结构时一致的。...: 类型参数需要是一个联合类型 类型参数需要通过泛型参数的方式传入,不能直接进行条件类型判断 条件类型中的泛型参数不能被包裹 条件类型分布式特性的作用: 将联合类型拆开,每个分支分别进行一次条件类型判断

    1.2K50
    领券