是否可以从联合类型创建一个类型,其中联合的每个元素都将根据模式进行转换?我只需要加一个前缀:
type EventNames = 'DragStart' | 'Drag' | 'DragStop'
type HandlerNames = Prefix<'on', EventNames> // 'onDragStart' | 'onDrag' | 'onDragStop'
是否可以从联合类型创建一个类型,其中联合的每个元素都将根据模式进行转换?我只需要加一个前缀:
type EventNames = 'DragStart' | 'Drag' | 'DragStop'
type HandlerNames = Prefix<'on', EventNames> // 'onDragStart' | 'onDrag' | 'onDragStop'
是的,这是可能的.由于TypesScript 4.1,您可以将Conditional Type与Template Literal Type结合使用,如下所示:
type EventNames = "DragStart" | "Drag" | "DragStop";
type Prefix<K> = K extends string ? `on${K}` : K;
// --> "onDragStart" | "onDrag" | "onDragStop"
const myEvent: Prefix<EventNames> = "onDrag";
或者直接定义泛型以扩展string
以传递前缀:
type EventNames = "DragStart" | "Drag" | "DragStop";
type Prefix<Prefix extends string, T extends string> = `${Prefix}${T}`;
const myEvent: Prefix<"on", EventNames> = "onDrag";