Typescript 类型体操
用发布订阅模式解耦
const eventNames = ['API:UN_AUTH', 'API:INVALID']
type EventNames = (typeof eventNames)[number]class EventEmitter {private listeners: Record<string, Set<Function>> = {'API:UN_AUTH': new Set(),'API:INVALID': new Set()}on(eventName: EventNames, listener: Function) {this.listeners[eventName].add(listener)}emit(eventName: EventNames, ...args: any[]) {this.listeners[eventName].forEach((listener) => listener(...args))}
}export default new EventEmitter()
前置的不定量参数(类型标注)
type JSTypeMap = {string: stringnumber: numberboolean: booleanundefined: undefinedobject: objectsymbol: symbolbigint: bigintnull: null
}type JSTypeNames = keyof JSTypeMaptype ArgsType<T extends JSTypeNames[]> = {[I in keyof T]: JSTypeMap[T[I]]
}declare function addImpl<T extends JSTypeNames[]>(...args: [...T, (...args: ArgsType<T>) => any]): void
不可变类型
type DeepReadonly = {readonly [P in keyof T]: T[P] extends object ? DeepReadonly<T[P]> : T[P]
}interface Obj {a: numberb: string
}
let obj: Readonly<Obj> = {a: 1,b: '2'
}
使用元祖生成联合类型
const colors = ['♥', '♦', '♣', '♠'] as const
const values = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K'] as const
type Color = (typeof colors)[number]
type Value = (typeof values)[number]