当前位置: 首页 > 知识库问答 >
问题:

关于"in"操作符在typescript类型中作用,这段官方的代码有点看不懂,求解释?

康弘义
2024-04-28
type EventConfig<Events extends { kind: string }> = {    [E in Events as E["kind"]]: (event: E) => void;}type SquareEvent = { kind: "square", x: number, y: number };type CircleEvent = { kind: "circle", radius: number }; type Config = EventConfig<SquareEvent | CircleEvent>//type Config = {    square: (event: SquareEvent) => void;    circle: (event: CircleEvent) => void;}

[E in Events as E["kind"]]这段代码不太理解,如果写成 E in keyof Events能理解成E是Events对象的每一个key,但是直接E in Events那这个E代表什么呢?

共有2个答案

邓宜年
2024-04-28

in 可以遍历联合类型中的每一个类型

type In<T extends string | number | symbol> = {    [K in T]: K}type TypeA = 1type TypeB = "2"type TypeC = "c"type A = In<TypeA | TypeB | TypeC>==>type A = {    1: 1;    2: "2";    c: "c";}

K 依次为 TypeATypeBTypeC

乔宏峻
2024-04-28

在 TypeScript 中,in 关键字在类型系统中用于映射类型(Mapped Types)。当你看到 [E in Events as E["kind"]]: (event: E) => void; 这段代码时,它实际上是在创建一个新的类型,该类型的属性键由 Events 类型的 kind 属性值确定,并且每个属性的值是一个函数,该函数接受一个与相应 kind 值相对应的事件类型作为参数。

在这个例子中,Events 是一个泛型参数,代表一个对象类型,该对象有一个 kind 属性。Events 可以是任何具有 kind 属性的对象类型。

[E in Events as E["kind"]]: (event: E) => void; 这段代码的解释如下:

  • E in Events:这里的 EEvents 类型中每个属性的名称。但是,由于我们使用了 as E["kind"],这实际上会将 E 解释为 Events 中每个属性的 kind 值。
  • as E["kind"]:这会将键名(即 E)映射为 Events 中相应属性的 kind 值。在这个例子中,Events 可以是 SquareEventCircleEvent,因此 E["kind"] 的值将是 "square""circle"
  • (event: E) => void:对于每个 kind 值,我们定义一个函数类型,该函数接受一个参数 event,其类型为与 kind 值相对应的 Events 类型。

因此,当你使用 EventConfig<SquareEvent | CircleEvent>,你会得到以下类型:

{    square: (event: SquareEvent) => void;    circle: (event: CircleEvent) => void;}

这里,EE in Events 中实际上是一个类型变量,代表 Events 中每个属性的类型。然后,通过 as E["kind"],我们将这些属性名映射为它们相应的 kind 值,从而得到一个新的类型,其属性名由 Events 中每个属性的 kind 值确定。

 类似资料:
  • jQuery获取对象类型字符串,这段代码是什么意思? class2type[ toString.call( obj ) ]不理解这句话的作用是什么?

  • https://nuxt.com/docs/guide/directory-structure/error 上面这段代码如何理解? error: Object as () => NuxtError 这个有点蒙,试着能理解,就是定义 error的类型是一个函数 ,该函数返回NuxtError 是这样吗? 既然error是一个函数类型,为什么模板中是 直接访问 statusCode属性?而不是使用er

  • 本文向大家介绍关于Js中new操作符的作用详解,包括了关于Js中new操作符的作用详解的使用技巧和注意事项,需要的朋友参考一下 前言 Js是当今时代最常用的代码操作语言,其中new操作符尤为常见。对于很多代码小白来说,并不清楚new在Js中扮演着怎样的角色,具体是做什么用,干了什么。本文从new操作符的作用着手,简单介绍new操作符相关知识。 什么是new? 众所周知,在JS中,new的作用是通过

  • 不是很理解为什么会报错? 在js当中这类代码是可以正常执行的 后续 加了类型的定义any, 报错就消失了.. 但是为什么会有这种情况出现呢? 我在 ts 中不给类型直接赋值, 难道程序识别不出 this.obj 是一个对象吗?