首页
学习
活动
专区
工具
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.8K20

TS 从 0 到 1 - 进阶

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

70120

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

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

92720

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

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

26630

一份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 高级用法以及项目实战问题

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

1.8K50

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

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

18730

一份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变量原因。

93420

【文末送书】Typescript 使用日志

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

2.8K10

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

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

1.6K10

TypeScript高级类型-Partial

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

65720

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

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

2.2K30

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

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

9010

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.8K60

TS 进阶 - 类型系统

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

1.1K50

TypeScript 演化史 — 第七章】映射类型和更好字面量类型推断

这就是为什么当试图将 42 赋值给 x 属性时,TypeScript 会出错。在运行时,分配要么抛出一个类型错误(严格模式),要么静默失败(非严格模式)。...: 用一个名为 T 类型参数定义了一个 Readonly。...在方括号使用keyof 操作符。keyof T 将 T 类型所有属性名表示为字符串字面量类型联合。 方括号 in 关键字表示我们正在处理映射类型。...因为 Readonly 类型,所以咱们为T提供每种类型都正确地入了Object.freeze() 。...从类型别名开始: type ReadonlyPoint = Readonly; 现在,咱们可以在 Readonly 类型 T 替换 Point 类型: type ReadonyPoint

3.7K40
领券