【发布时间】:2018-10-29 02:37:23
【问题描述】:
我的类型安全查询生成器中有以下数据类型。
// types
type SUDI = S | U | D | I
type SUD = S | U | D
type S = 'Select'
type U = 'Update'
type D = 'Delete'
type I = 'Insert'
// states
interface STATE_SUDI { state: 'SUDI' }
interface STATE_SUD { state: 'SUD' }
interface STATE_S { state: 'S' }
interface STATE_U { state: 'U' }
interface STATE_D { state: 'D' }
interface STATE_I { state: 'I' }
您可以在类型和状态之间进行转换。
type TypeToState<T> =
SUDI extends T ? STATE_SUDI :
SUD extends T ? STATE_SUD :
S extends T ? STATE_S :
U extends T ? STATE_U :
D extends T ? STATE_D :
I extends T ? STATE_I : never;
type StateToType<T> =
T extends STATE_SUDI ? SUDI :
T extends STATE_SUD ? SUD :
T extends STATE_S ? S :
T extends STATE_U ? U :
T extends STATE_D ? D :
T extends STATE_I ? I : never;
状态数组的类型是所有状态类型的并集数组。例如:
declare let array: (STATE_SUDI | STATE_SUD)[]
当数组元素的类型用StateToType映射时,变成:
StateToType<STATE_SUDI | STATE_SUD>
// = StateToType<STATE_SUDI> | StateToType<STATE_SUD>
// = SUDI | SUD
// = (S | U | D | I) | (S | U | D)
// = (S | U | D | I)
// = SUDI
我希望的行为是将StateToType 应用于工会的每个成员,然后得到交集。
BetterStateToType<test>
// = StateToType<STATE_SUDI> & StateToType<STATE_SUD>
// = SUDI & SUD
// = (S | U | D | I) & (S | U | D)
// = (S | U | D)
// = SUD
我需要帮助来定义BetterStateToType。
我知道可以将并集转换为交集,但我不知道是否也可以在交集之前应用映射。
【问题讨论】:
标签: typescript generics