Skip to content

Instantly share code, notes, and snippets.

@SagnikPradhan
Created April 16, 2021 01:39
Show Gist options
  • Save SagnikPradhan/5f12fca41a0e88ca0fc3419ca5c1b2c9 to your computer and use it in GitHub Desktop.
Save SagnikPradhan/5f12fca41a0e88ca0fc3419ca5c1b2c9 to your computer and use it in GitHub Desktop.
class F {
f = "I am F"
}
class A extends F { a = "I am a" }
class B extends F { b = "I am b" }
class C extends F { c = "I am c" }
interface Something<T extends { [i: string]: F } = {}> {
register: <K extends string, C extends F>(name: K, classInstance: C) => Something<T & { [key in K]: C }>
getClass: <K extends keyof T>(className: K) => T[K]
}
function something<T extends { [i: string]: F } = {}>() {
const classes = {} as { [i: string]: F }
const somethingInstance: Something = {
register: <K extends string, C extends F>(name: K, classInstance: C) => {
classes[name] = classInstance
return somethingInstance as Something<T & { [key in K]: C }>
},
getClass: <K extends keyof T>(className: K): T[K] => {
return classes[className as string] as T[K]
}
}
return somethingInstance
}
const somethingInstance = something().register("a", new A).register("b", new B)
const aInstance = somethingInstance.getClass("a")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment