我在 TypeScript 中为操作定义了一个联合类型:
type Action = {
type: 'reset',
} | {
type: 'add',
payload: number
} | {
type: 'minus',
payload: number
}
在某些函数中,我想引用联合类型的一部分,例如:
function handleAdd(state: State, action: {
type: 'add',
payload: number
}): State => {
// handle the add
}
有没有办法简化打字action
所以我不需要重复完整的定义
{
type: 'add',
payload: number
}
here?
Update:
我不想单独预定义每个操作类型。还有其他解决方案吗,例如Action[type='add']
?
这可以通过依赖来实现分配条件类型 https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-8.html#distributive-conditional-types:
type ExtractType<T extends Action['type'], A = Action> =
A extends { type: T } ? A : never;
type Add = ExtractType<'add'>; // { type: 'add'; payload: number; }
操场 https://www.typescriptlang.org/play?#code/C4TwDgpgBAggxsAlgewHZQLxQN4CgoFSiQBcUA5AE4QDOEw5ANLgL5QA%20O%20hxEZ5AQwAmQptwJgBIADbJhZVAFcAtgCMIlVhy6Ei4PhWWIlNMbsky5QhSvWaWuXLygBRAB7BKAhABV9AHh8oCA8IVCEaWAQUVABtcl5yAF1GWEwopDQAPnSYYNDwyOw9UiggtgB%20NIUIADcNAG5HZxgRdPdPb2A-SH9BEXIshqgAehGcEoN%200WGLWXkoJTVGqBYgA
分布式条件类型在实例化期间自动分布在联合类型上。例如,一个实例化T extends U ? X : Y
使用类型参数A | B | C
for T
被解析为(A extends U ? X : Y) | (B extends U ? X : Y) | (C extends U ? X : Y)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)