一则自定义工具类型中的语法细节
devTypeScript, memo

一则自定义工具类型中的语法细节

Published On
| 更新于
Updated On
6分钟阅读ecf4076f
概述:基础向,简要复习巩固并形成记录: 关于 TS 一则工具类型定义下涉及到的语法细节

最前

之前本站点的一篇博文: TypeScript 下 Mapped Types 应用场景例,有提到如何在 TS 项目中自定义一则工具类型,来便捷地为比如全局状态生成其对应的动作函数的对象类型

但是当时笔者的 TS 语法基础掌握不甚熟练,所以在该工具类型的实现上,只能勉强对照参考例书写,而不能完全明白书写规则(细节),最近(2025.07)又重新复习巩固 TS 相关知识点,所以下面就简单围绕这一则工具类型示例,简要陈列涉及到的一些语法点。(或许也能帮助 TS 初学读者更快地理清类似的类型定义细节)

另外,之前的博文里,因为没有使用到条件类型,所以冗余地分别定义了: Action4State、ActionToggle4State, 在下面的代码示例中,给出了更精简的实现。

正文

先看该工具类型的效果表现:

代码示例

type ActionType4InitState<State> = {
  [P in keyof State & string as State[P] extends boolean
    ? `toggle${Capitalize<P>}`
    : `set${Capitalize<P>}`]: (value: State[P]) => void;
};

const state = {
  foo: 1,
  bar: false,
  baz: {
    o: 0,
    o2: "",
  },
};

type ActionType4CurrentState = ActionType4InitState<typeof state>;

/** 等价于 */
type ActionType4CurrentState2 = {
  setFoo: (value: number) => void;
  toggleBar: (value: boolean) => void;
  setBaz: (value: { o: number; o2: string }) => void;
};

语法细节

来主要看该(工具)类型定义:

type ActionType4InitState<State> = {
  [P in keyof State & string as State[P] extends boolean
    ? `toggle${Capitalize<P>}`
    : `set${Capitalize<P>}`]: (value: State[P]) => void;
};

下面以列表的形式简要罗列涉及语法:

索引类型相关的语法:

  • 索引签名类型
    • 形式如: [key: string]: string, 显然的是用在对象类型中,描述一组键值类型相同的接口结构。
  • 索引类型查询
    • 形式如:keyof T,其返回的是可用作对象类型下键名(所在位置的键名类型)的联合类型,
      • 比如:keyof any 得到的联合类型就为: string | number | symbol
    • 而通常的,对一般对象类型使用索引类型查询,得到的即是收窄到精确的字面量类型的联合类型,比如:"foo" | "bar" | "baz"
  • 索引类型访问
    • 形如:T[P], 其返回的就是对象类型下对应键 [someProperty] 声明的类型

其他还涉及到:

  • 泛型
    • 也可叫做“泛型坑位”
    • 不作展开,总之类同于函数的入参声明
  • 交叉类型
    • 这里交叉类型是被用来过滤指定类型:keyof state & string: 其通过 & string 排除了对象类型下键名类型中的可能存在的 number 、symbol 类型
      • 实际也可比作是求交集的操作。(更正:更准确的说, 使用 &( A & B), 是构造一个“同时满足” 类型 A 和 B 的类型;而另一内置工具类型:Extract 才是用于求取联合类型的交集)
  • 类型断言
    • 形如:[someVal/OrSomeType] as [someType]
    • 多见的,有时代码中我们使用二重断言,比如:[someVal] as unknown as [someType]
    • 代码示例中,我们使用类型断言,按照条件分支,断言为各自对应的字面量类型,比如:toggle${Capitalize<P>}
      • 更正:这里相关语法出现在类型索引签名中,配合 P in 语法,不应说为是类型断言,而是 TS 下的重映射行为
  • 条件类型
    • 如上面的三元表达式的使用: [condition] ? [someType] : [otherType]
  • 类型约束
    • 这里使用类型约束来作为条件类型的判断条件:T[P] extends boolean ? [res1] : [res2]
  • 映射类型
    • 形如:P in [someType],就是将一个联合类型下的每一个成员映射出来,代码示例中,该工具类型通过 in 关键字的最终处理结果就表现为:"setFoo""toggleBar" (实际可以理解为数组下的原生方法:map

一则自定义工具类型中的语法细节

https://infen.cc/loc-blog/34_ts-custom-utility-types[Copy]
本文作者
Hyperiop
创建/发布于
Published On
更新/发布于
Updated On
许可协议
CC BY-NC-SA 4.0

转载或引用本文时请遵守“署名-非商业性使用-相同方式共享 4.0 国际”许可协议,注明出处、不得用于商业用途!分发衍生作品时必须采用相同的许可协议。