Created
February 10, 2025 19:02
-
-
Save asleepace/7ba3ac4681504e944ed97c3dbb349911 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// https://www.typescriptlang.org/play/?#code/MYewdgziA2CmB0w4EMBOAKAlAKG6SALgAQAkyEAnmMAJJgCWxAvEQMoUC2ARjOgOQB9AeSrAB9BgQGUOfHPgjESExgCVYyACYUiLdt16DhlauMkDU2uXnCLSwVBoKwAcrADuutpx7R+QkVMHJ1gBMA9rPGhyCCIAIXJYIgBvbCJ0okVkAnpgTJ8YOjUNbS8sXQA+UhUCdS0KAG40jKycvMDaSX1fMsxK0g6igiaMzIJs3PyDaABhR2zXD17+kmCFt3cm5vTWyY6iAG1V+ecNgF1y1NHRxwIAV1QwInDPAgALeggsI5q67TPtkQAL64UYAB1Q9AAbgtDmQTJ1GGcAFxEcpMKoABVQIA4n1gAB5kGAKFUAD5EbG4-EEqEgeiaCqAiHQ2E-SR-Cgoyk4vEQQnE0mgjIKAioO7AAggDB9K7XdLvT5HQaSM7LDE86n8+COABWsEl-A4dzswGQ0GgREVEHgNQA6ow3qwpahkABzWDlCREUXiyXSgCE1nlCo+EHZxXqapYVL5CEcUGgUM9ADNzfycKMQYD9vbHc7pe7PWaLVxkMAANao9CabLIVEEChg2AgFNWsN9DWxml0hkVWWA0bWiO1EpcrwvTVx9D7dAJmDJgA0RD1BoInaqcpDItsxGbqAgn2cmgAInWvMlnsgOLBUXxQNAJHxgURyK+SYOQ8h3MhGD7zdAZaVug+6HoosCnnWmbbhk85Jp61rQfKQJIcC2DZlEMREAAsiAmiwJasAAB7OGAmixAk-IpICzI4s4koQUQtbjKigrCukvoSi6lyfjsdz7lgvHtp8tqSA67wFq6HozgiaKgUeEFnuMG7UTBO6QDACDQCAbr8PJ4GQeMfDLvpx5KcgqFZqh2ajPyBDmSBaA5Oa5mopiTn0OaRIklULDJChqkhta8DMcgF5EPAkXBaFy6RfAYIeS554gtutwPE80V1oCILZvsKZ3NQOTgEQ2laAAYryklFjxNywPcjzPEs3b8ugc6wImyYqVu1yOAAjnc7UEAAggwHATOAFXXp66KbkJtUdZ6l6haiACMABMADMy6fAAomAyBcHAmgNuKsDLvtN53g+T7ApZGQodlODZqKmpERQuH4ZaLCTlSb3oB9BHLt1+ycYaA6pXV6Wvj+f4A9ARxrKcHgXNZ6F9G+BUVmAIDuE8b7dS8WBubyNJw0yNnYHlBWSvQxVjRINXqXYEhZNQSQsN+v7ED9OJvXDgmAiz4xs-AdkOd1owXbeRB8M4yBvMSfCPexPq2Jp8DabpQvEsAsA4OhuD02AgkKOrmtGr+YB7ZochAA | |
console.clear() | |
const $asyncInit = Symbol('__async_init_sym') | |
const $initReady = Symbol('__async_init_rdy') | |
const $createNew = Symbol('__async_create_new') | |
class Base { | |
static symbolInitReady = () => $initReady; | |
static asyncInitSymbol = () => $asyncInit; | |
static symbolCreateNew = () => $createNew; | |
static async [$createNew]() { | |
return new this()[$initReady] | |
} | |
private [$asyncInit]: () => Promise<any> | Promise<void> | |
private [$initReady]: Promise<any> | |
constructor() { | |
this[$asyncInit] = () => Promise.reject('must call this.initWithStorage() in constructor!') | |
this[$initReady] = Promise.resolve(false) | |
} | |
async initWithStorage(callback: (data: typeof this) => Promise<void>) { | |
this[$initReady] = new Promise(async (resolve, reject) => { | |
const persistedData = { name: 'colin' } as any | |
await callback(persistedData) | |
resolve(this) | |
}) | |
} | |
} | |
class Model extends Base { | |
protected data: any | |
constructor() { | |
super() | |
this.initWithStorage(async (persistedData) => { | |
console.log('persistedData', persistedData) | |
}) | |
} | |
setData(partialData: Partial<any> = {}) { | |
this.data = { ...this.data, ...partialData } | |
return this.data | |
} | |
} | |
async function loadFromStorage() { | |
return new Promise((resolve) => { | |
requestAnimationFrame(() => { | |
resolve({ data: 123, isEnabled: true, name: 'colin' }) | |
}) | |
}) | |
} | |
const ProxyModel = new Proxy(Model, { | |
async construct() { | |
return await Model[$createNew]() | |
} | |
}) as unknown as { | |
new(): Promise<Model> | |
} | |
async function main() { | |
const instance = await new ProxyModel() | |
instance.setData({ | |
name: 'teahan' | |
}) | |
console.log(instance) | |
} | |
main() | |
console.log('mainEnd') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment