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