Skip to content

Commit

Permalink
fix(types): 解决新增加类型未导入的问题
Browse files Browse the repository at this point in the history
  • Loading branch information
zhangfisher committed Nov 13, 2023
2 parents e91344a + 818755f commit 7b1f60a
Show file tree
Hide file tree
Showing 5 changed files with 109 additions and 54 deletions.
26 changes: 24 additions & 2 deletions docs/guide/types.md
Original file line number Diff line number Diff line change
Expand Up @@ -364,6 +364,28 @@ type fn2 = ChangeReturns<fn,string>
type A = ValueOf<Record<string,number>>
// A == number
```
## Optional
export type ReactFC<Props=unknown> = React.FC<React.PropsWithChildren<
Pick<React.HTMLAttributes<HTMLElement>,'className' | 'style'> & Props>>
将类型中除指定属性外的所有属性变为可选属性,
```typescript
export interface SiteOptions{
id:string
icon:string
logo:string
title:string
path:string
}

type mysite = Optional<SiteOptions,'id' | 'path'>

// type mysite == {
// id:string
// icon?:string
// logo?:string
// title?:string
// path:string
// }

```

66 changes: 33 additions & 33 deletions src/events/flexEvent.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,26 +42,26 @@ export type FlexListenerRegistry<M,E> = Map<E,FlexEventListenerRegistry<M>>
/**
* Event: 指定一个通用事件类型
*/
export class FlexEvent<Message=any,Events extends string = string>{
export class FlexEvent<Message=any,Events extends string = string,Options extends Record<string,any>= Record<string,any>>{
// {"<事件名称>":{<listenerId>:[Callback,<侦听次数>]}}
#listeners:FlexListenerRegistry<Message,Events>= new Map()
#options:Required<FlexEventOptions>
private _listeners:FlexListenerRegistry<Message,Events>= new Map()
private _options:Required<FlexEventOptions & Options>
// 保留最后一次触发的消息,key=事件名称,value=消息
#lastMessage:Record<string,any> = {}
private _lastMessage:Record<string,any> = {}
static listenerSeqId:number = 0
constructor(options:FlexEventOptions = {ignoreError:true,context:null}){
this.#options = assignObject({
this._options = assignObject({
ignoreError:true,
wildcard: true,
delimiter:"/",
context:null
},options) as Required<FlexEventOptions>
},options) as Required<FlexEventOptions & Options>
}
get options(){return this.#options}
get delimiter(){return this.#options.delimiter}
get options(){return this._options}
get delimiter(){return this._options.delimiter}
get context(){ return this.options.context}
get listeners(){return this.#listeners}
get retainedMessages(){return this.#lastMessage}
get listeners(){return this._listeners}
get retainedMessages(){return this._lastMessage}
/**
* 检测事件是否匹配
*
Expand All @@ -80,7 +80,7 @@ export class FlexEvent<Message=any,Events extends string = string>{
*/
private isEventMatched(pattern:string,event:string):boolean{
if(pattern == event) return true
if(this.#options.wildcard && pattern.includes("*")){
if(this._options.wildcard && pattern.includes("*")){
// 由于通配符**与*冲突,所以先将**替换成一个特殊的字符
const regex =new RegExp("^"+pattern.replaceAll("**",`__###__`).replaceAll("*","[\\w\\*]*").replaceAll("__###__",`[\\w\\\\*${this.delimiter}]*`)+"$")
return regex.test(event)
Expand All @@ -104,11 +104,11 @@ export class FlexEvent<Message=any,Events extends string = string>{
*/
on(event:Events,callback:FlexEventListener<Message>,options?:SubscribeOptions):FlexEventSubscriber | number{
const { objectify = false,count=-1 } =Object.assign({},options) as Required<SubscribeOptions>
if(!this.#listeners.has(event)){
this.#listeners.set(event,new Map())
if(!this._listeners.has(event)){
this._listeners.set(event,new Map())
}
const listenerId = ++ FlexEvent.listenerSeqId
const eventListeners = this.#listeners.get(event) as FlexEventListenerRegistry<Message>
const eventListeners = this._listeners.get(event) as FlexEventListenerRegistry<Message>
eventListeners?.set(listenerId,[callback,count])
// 如果启用了retain,则应该马上触发最后保存的事件
this.emitRetainEvent(event,listenerId,eventListeners)
Expand All @@ -117,7 +117,7 @@ export class FlexEvent<Message=any,Events extends string = string>{
off:()=>{
eventListeners?.delete(listenerId)
if(eventListeners?.size==0){
this.#listeners.delete(event)
this._listeners.delete(event)
}
}
}
Expand All @@ -131,12 +131,12 @@ export class FlexEvent<Message=any,Events extends string = string>{
*/
private emitRetainEvent(event:Events,listenerId:number,eventListeners:FlexEventListenerRegistry<Message>){
//setTimeout(()=>{
if(event in this.#lastMessage){
this.executeListener(listenerId,eventListeners,this.#lastMessage[event])
if(event in this._lastMessage){
this.executeListener(listenerId,eventListeners,this._lastMessage[event])
}else if(this.options.wildcard){ // 检查是否有通配符
for(const [key] of Object.entries(this.#lastMessage)){
for(const [key] of Object.entries(this._lastMessage)){
if(this.isEventMatched(event,key) || this.isEventMatched(key,event) ){
this.executeListener(listenerId,eventListeners,this.#lastMessage[key])
this.executeListener(listenerId,eventListeners,this._lastMessage[key])
}
}
}
Expand All @@ -161,7 +161,7 @@ export class FlexEvent<Message=any,Events extends string = string>{
private forEachListeners(callback:({event,listenerId,listener,count,eventListeners}:{event:Events,listenerId:number,listener:FlexEventListener<Message>,count:number,eventListeners:FlexEventListenerRegistry<Message>})=>boolean | void){
// {"<事件名称>":{<listenerId>:[Callback,<侦听次数>]}}
let isAbort = false
for(let [event,eventListeners] of this.#listeners.entries()){
for(let [event,eventListeners] of this._listeners.entries()){
if(isAbort) break
for(let [listenerId,[listener,count]] of eventListeners.entries()){
if(isAbort) break
Expand Down Expand Up @@ -200,9 +200,9 @@ export class FlexEvent<Message=any,Events extends string = string>{
*/
private getMatchedListeners(event:Events):[Events,FlexEventListenerRegistry<Message> | undefined][] {
if(this.options.wildcard){ // 启用通配符
return [...this.#listeners.entries()].filter(([eventName])=>(this.isEventMatched(eventName,event)) || this.isEventMatched(event,eventName))
return [...this._listeners.entries()].filter(([eventName])=>(this.isEventMatched(eventName,event)) || this.isEventMatched(event,eventName))
}else{
return [[event,this.#listeners.get(event)]]
return [[event,this._listeners.get(event)]]
}
}

Expand Down Expand Up @@ -234,7 +234,7 @@ export class FlexEvent<Message=any,Events extends string = string>{
this.forEachListeners(({listenerId,eventListeners,event})=>{
if(listenerId == arguments[0]){
eventListeners.delete(listenerId)
if(this.#listeners.get(event)?.size==0) this.#listeners.delete(event)
if(this._listeners.get(event)?.size==0) this._listeners.delete(event)
return false
}
})
Expand All @@ -243,7 +243,7 @@ export class FlexEvent<Message=any,Events extends string = string>{
this.forEachListeners(({listenerId,listener,eventListeners,event})=>{
if(listener == callback){
eventListeners.delete(listenerId)
if(this.#listeners.get(event)?.size==0) this.#listeners.delete(event)
if(this._listeners.get(event)?.size==0) this._listeners.delete(event)
}
})
}
Expand All @@ -252,7 +252,7 @@ export class FlexEvent<Message=any,Events extends string = string>{
this.forEachEventListeners(arguments[0] as Events,({event,listenerId,listener,eventListeners})=>{
if(event == arguments[0] && listener == arguments[1] ){
eventListeners.delete(listenerId)
if(this.#listeners.get(event)?.size==0) this.#listeners.delete(event)
if(this._listeners.get(event)?.size==0) this._listeners.delete(event)
}
})
}
Expand Down Expand Up @@ -320,14 +320,14 @@ export class FlexEvent<Message=any,Events extends string = string>{
})
}
clear(){
this.#lastMessage={}
this._lastMessage={}
this.offAll()
}
offAll(event?:Events){
if(event){
this.#listeners.delete(event)
this._listeners.delete(event)
}else{
this.#listeners.clear()
this._listeners.clear()
}
}
/**
Expand Down Expand Up @@ -379,7 +379,7 @@ export class FlexEvent<Message=any,Events extends string = string>{
results.push(this.executeListener(listenerId,eventListeners,message))
if(typeof(callback)=='function') callback(listenerId)
if(eventListeners.size==0){
this.#listeners.delete(eventName)
this._listeners.delete(eventName)
}
})
return results
Expand All @@ -394,7 +394,7 @@ export class FlexEvent<Message=any,Events extends string = string>{
*/
emit(event:Events,message?:Message,retain?:boolean){
if(retain){
this.#lastMessage[event] = message
this._lastMessage[event] = message
}
return this.executeListeners(event,message)
}
Expand All @@ -408,7 +408,7 @@ export class FlexEvent<Message=any,Events extends string = string>{
async emitAsync(event:Events,message?:Message,retain?:boolean){
const listeners = this.getListeners(event)
if(retain){
this.#lastMessage[event] = message
this._lastMessage[event] = message
}
let results = await Promise.allSettled(listeners.map((listener:Function) =>{
return listener.call(this,message)
Expand All @@ -424,8 +424,8 @@ export class FlexEvent<Message=any,Events extends string = string>{
}
}
}
if(this.#listeners.get(eventName)?.size==0){
this.#listeners.delete(eventName)
if(this._listeners.get(eventName)?.size==0){
this._listeners.delete(eventName)
}

})
Expand Down
36 changes: 18 additions & 18 deletions src/events/liteEvent.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,11 @@ export type LiteListenerRegistry<M,E> = Map<E,LiteEventListenerRegistry<M>>

export class LiteEvent<Message=any,Events extends string = string>{
// {"<事件名称>":{<listenerId>:[Callback,<侦听次数>]}}
#listeners:LiteListenerRegistry<Message,Events>= new Map()
private _listeners:LiteListenerRegistry<Message,Events>= new Map()
// 保留最后一次触发的消息,key=事件名称,value=消息
#lastMessage:Record<string,any> = {}
private _lastMessage:Record<string,any> = {}
static listenerSeqId:number = 0
get listeners(){return this.#listeners}
get listeners(){return this._listeners}
/**
* 订阅事件并返回一个事件订阅ID
*
Expand All @@ -42,11 +42,11 @@ export class LiteEvent<Message=any,Events extends string = string>{
*/
on(event:Events,callback:LiteEventListener<Message>,options?:LiteEventSubscribeOptions):LiteEventSubscriber | number{
const { objectify = false,count=-1 } = Object.assign({},options) as Required<LiteEventSubscribeOptions>
if(!this.#listeners.has(event)){
this.#listeners.set(event,new Map())
if(!this._listeners.has(event)){
this._listeners.set(event,new Map())
}
const listenerId = ++LiteEvent.listenerSeqId
const eventListeners = this.#listeners.get(event) as LiteEventListenerRegistry<Message>
const eventListeners = this._listeners.get(event) as LiteEventListenerRegistry<Message>
eventListeners?.set(listenerId,[callback,count])
// 如果启用了retain,则应该马上触发最后保存的事件
this.emitRetainEvent(event,listenerId,eventListeners)
Expand All @@ -55,7 +55,7 @@ export class LiteEvent<Message=any,Events extends string = string>{
off:()=>{
eventListeners?.delete(listenerId)
if(eventListeners?.size==0){
this.#listeners.delete(event)
this._listeners.delete(event)
}
}
}
Expand All @@ -68,8 +68,8 @@ export class LiteEvent<Message=any,Events extends string = string>{
* @param event
*/
private emitRetainEvent(event:Events,listenerId:number,eventListeners:LiteEventListenerRegistry<Message>){
if(event in this.#lastMessage){
this.executeListener(listenerId,eventListeners,this.#lastMessage[event])
if(event in this._lastMessage){
this.executeListener(listenerId,eventListeners,this._lastMessage[event])
}
}
/**
Expand All @@ -91,7 +91,7 @@ export class LiteEvent<Message=any,Events extends string = string>{
private forEachListeners(callback:({event,listenerId,listener,count,eventListeners}:{event:Events,listenerId:number,listener:LiteEventListener<Message>,count:number,eventListeners:LiteEventListenerRegistry<Message>})=>boolean | void){
// {"<事件名称>":{<listenerId>:[Callback,<侦听次数>]}}
let isAbort = false
for(let [event,eventListeners] of this.#listeners.entries()){
for(let [event,eventListeners] of this._listeners.entries()){
if(isAbort) break
for(let [listenerId,[listener,count]] of eventListeners.entries()){
if(isAbort) break
Expand All @@ -113,7 +113,7 @@ export class LiteEvent<Message=any,Events extends string = string>{
private forEachEventListeners(event:Events,callback:ForEachLiteEventListenerCallback<Message,Events>){
// {"<事件名称>":{<listenerId>:[Callback,<侦听次数>]}}
let isAbort = false
let matchedListeners = [[event,this.#listeners.get(event)]] as [Events,LiteEventListenerRegistry<Message> | undefined][]
let matchedListeners = [[event,this._listeners.get(event)]] as [Events,LiteEventListenerRegistry<Message> | undefined][]
for(let [eventName,eventListeners] of matchedListeners){
if(!eventListeners) continue
for(let [listenerId,[listener,count]] of eventListeners){
Expand Down Expand Up @@ -150,7 +150,7 @@ export class LiteEvent<Message=any,Events extends string = string>{
this.forEachListeners(({listenerId,eventListeners,event})=>{
if(listenerId == arguments[0]){
eventListeners.delete(listenerId)
if(this.#listeners.get(event)?.size==0) this.#listeners.delete(event)
if(this._listeners.get(event)?.size==0) this._listeners.delete(event)
return false
}
})
Expand All @@ -159,7 +159,7 @@ export class LiteEvent<Message=any,Events extends string = string>{
this.forEachListeners(({listenerId,listener,eventListeners,event})=>{
if(listener == callback){
eventListeners.delete(listenerId)
if(this.#listeners.get(event)?.size==0) this.#listeners.delete(event)
if(this._listeners.get(event)?.size==0) this._listeners.delete(event)
}
})
}
Expand All @@ -168,7 +168,7 @@ export class LiteEvent<Message=any,Events extends string = string>{
this.forEachEventListeners(arguments[0] as Events,({event,listenerId,listener,eventListeners})=>{
if(event == arguments[0] && listener == arguments[1] ){
eventListeners.delete(listenerId)
if(this.#listeners.get(event)?.size==0) this.#listeners.delete(event)
if(this._listeners.get(event)?.size==0) this._listeners.delete(event)
}
})
}
Expand Down Expand Up @@ -199,9 +199,9 @@ export class LiteEvent<Message=any,Events extends string = string>{
}
offAll(event?:Events){
if(event){
this.#listeners.delete(event)
this._listeners.delete(event)
}else{
this.#listeners.clear()
this._listeners.clear()
}
}
/**
Expand Down Expand Up @@ -234,7 +234,7 @@ export class LiteEvent<Message=any,Events extends string = string>{
results.push(this.executeListener(listenerId,eventListeners,message))
if(typeof(callback)=='function') callback(listenerId)
if(eventListeners.size==0){
this.#listeners.delete(eventName)
this._listeners.delete(eventName)
}
})
return results
Expand All @@ -246,7 +246,7 @@ export class LiteEvent<Message=any,Events extends string = string>{
*/
emit(event:Events,message?:Message,retain?:boolean){
if(retain){
this.#lastMessage[event] = message
this._lastMessage[event] = message
}
return this.executeListeners(event,message)
}
Expand Down
5 changes: 4 additions & 1 deletion src/types/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,7 @@ export * from "./objectPath"
export * from "./allowEmpty"
export * from "./asyncFunction"
export * from "./arrayMember"
export * from "./overloads"
export * from "./overloads"
export * from "./optional"
export * from "./valueOf"
export * from "./changeReturns"
30 changes: 30 additions & 0 deletions src/types/optional.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/**
* 将类型中的所有属性变为可选属性,排除指定的键名。
*/
export type Optional<T, K extends keyof T = never> = Partial<T> & Required<Pick<T, K>>;

// export interface SiteOptions{
// id:string // 站点ID
// icon:string // 站点图标
// logo:string // 站点logo
// title:string //
// path:string // 站点路径
// }


// type mysite = Optional<SiteOptions,'id' | 'path'>


// let site:mysite = {
// id:"1",
// path:"ddd"
// }


// type mysite2 = Optional<SiteOptions>


// let site2:mysite2 = {
// id:"1"
// }

0 comments on commit 7b1f60a

Please sign in to comment.