TypeScriptãElectronãåããŠè§Šããšãããããå人ã§ãã©ãŠã¶ã¢ããªãTruefulããäœã£ãŠããŸããä»åã¯Workspaceç®¡çæ©èœã®å®è£ ã«çæãã忥ã®èšé²ã§ããèšèšèªäœã¯ååãŸã§ã«åºããŠãã£ãã®ã§ãããããã³ãŒããæžãå§ãããšããã®æ å ±ã¯èª°ã®è²¬ä»»ç¯å²ããã4åãééããŠããã®éœåºŠæ°ã¥ããŠã¯çŽãããšããå±éã«ãªããŸãããæåè«ãããããã®æã®åãéã®ã»ãã誰ãã®åœ¹ã«ç«ã€æ°ãããã®ã§ããã®ãŸãŸæžããŠãããŸãã
æåã«èããŠããããš
å®è£
ã«å
¥ãåãservices(åäžè²¬ä»»ã®å°ããªæäœ)ãšflows(servicesãçµã¿åããããŠãŒã¹ã±ãŒã¹åäœã®åŠç)ãšãã圹å²åæ
ãåå°ãšããŠçœ®ããŠããŸããããã®è»žãããã°ããããæ
å ±ãåŠçãã©ãã«çœ®ãã¹ããããæ¯å倿ã§ããã¯ãã ãšæã£ãŠããã®ã§ãããå®éã«æãåããå§ãããšããã®è»žãã®ãã®ãžã®çè§£ããŸãæºãããŸããã
転æ1: servicesãšflowsã®åœ¹å²ãéã«èŠããŠãã
-
åœåæ¡:
servicesãè€æ°ã®åŠçããŸãšããé倧æã§ãflowsãããŸããŸããåå¥æäœ - æ°ã¥ããããš: å®è£ ã®çžè«ãé²ããäžã§ããã®å®çŸ©ã以åèªåã§ç¢ºå®ããããã®ãšçéã§ããããšã«æ°ã¥ãã
-
çŽããå
容:
services=åäžè²¬ä»»ã®å°ããªæäœãflows=ããããçµã¿åããããŠãŒã¹ã±ãŒã¹åäœã®åŠçããšããæ£ããå®çŸ©ã«ç«ã¡è¿ã£ã
æ£çŽãèªåã§æ±ºããã¯ãã®å®çŸ©ããããŸã§ç°¡åã«ã²ã£ããè¿ããšã¯æã£ãŠããŸããã§ããããã®åŸã®ãã¹ãŠã®å€æã¯ãæ£ããå®çŸ©ã«ç«ã¡è¿ã£ãŠããé²ããŠããŸããä»ã«ããŠæããšããservicesããflowsããšããåèªã ããèŠããŠããŠããããããæã責任ã®éãã®æ¹ãèŠããŠããªãã£ãã®ãåå ã ã£ãããã«æããŸãã
転æ2: COMåŽjsonã«æ å ±ãæãããããããšãã
Workspaceã«ã¯ã·ã¹ãã ã ããCOMåŽjsonãšãããã¡ã€ã«ãšããŠç®¡çãããã·ã¹ãã 管ççšãããã§ã¹ãããããŸãããã®äžèº«ã決ããå Žé¢ã§ãstatus(active/dormant)ã»lastUsedTimeMsã»ä¿åå
ãã¹(fileSaveRoot)ã»ãã¡ã€ã«èªèº«ã®ããã·ã¥å€ãšã次ã
ã«ãå
¥ããã»ãããããããããªããåè£ãæµ®ãã³ãŸããã
-
åœåæ¡: COMåŽjsonã«
statusã»lastUsedTimeMsã»fileSaveRootã»ããã·ã¥å€ããã¹ãŠæããã -
æ°ã¥ããããš: ãããã¯ãã§ã«å¥ã®å±€ã責åãšããŠæã¡ããæ
å ±ã ã£ãã
statusã»lastUsedTimeMsã¯SQLiteåŽãsource of truthãšããŠæã€ã¹ãã§ãäºéã«æããããšåæããºã¬ããšãã«ã©ã¡ããæ£ãããåãããªããªããä¿åå ãã¹ã¯æžã蟌ã¿åŠçãåŒã³åºãåŽã®é¢å¿äºã§ãããããŒã¿èªèº«ãç¥ã£ãŠããå¿ èŠã¯ãªããããã·ã¥å€ã«è³ã£ãŠã¯ãæžã蟌ã¿åã®æ®µéã§ã¯ãŸã ãã¡ã€ã«ãååšããªããããåççã«ãèªåèªèº«ã®ããã·ã¥ãèªåã®äžã«å«ãããããšãã§ããªã -
çŽããå
容: æçµçã«COMåŽjsonã¯
{ id: number }ã®ã¿ãšãããæåæãããã»ã©ã·ã³ãã«ãªåœ¢ã«èœã¡çãã
// æçµçã«COMåŽjsonãæã€ã®ã¯ããã ã
type ComWorkspaceData = { id: number }
äžç¬èããŠã¯èžã¿ãšã©ãŸããã4åç¹°ãè¿ããçµæãããã§ããäžèº«ãèã倿ã«èŠããŸããããDBãæã€ã¹ãæ å ±ãããŠãŒã¶ãŒãç·šéããæ å ±(USERåŽjson)ããã·ã¹ãã ã ãã管çããæ å ±(COMåŽjson)ããšãã3å±€ã®è²¬ååé¢ãã¯ã£ãããããããã®ã¯å€§ããªåç©«ã§ããã
転æ3: number & nullãšnumber | nullãæ··åãã
åå®çŸ©ã§ãäžç®æãããããŠããŸãããnumberãŸãã¯nullãã衚çŸãããã£ãã®ã§ãããæžããã³ãŒãã¯ããã§ããã
function isArchivable(
dormantedTimeMs: number & null, // â æ¬æ¥ã¯ number | null
nowMs: number,
archiveThresholdMs: number
): boolean {
// ...
}
-
åœåæ¡:
number & nullã§ãnumberãŸãã¯nullãã衚çŸããããšãã -
æ°ã¥ããããš:
&ã¯Intersectionå(Aãã€B)ã§ãããnumber & nullã¯ãnumberã§ãããªããnullã§ãããå€ããšãããããããååšãããªãåã宣èšããŠãã -
çŽããå
容: Unionå(AãŸãã¯B)ã衚ã
|ã«ä¿®æ£ããnumber | nullãšãã
- dormantedTimeMs: number & null,
+ dormantedTimeMs: number | null,
TypeScriptãè§Šãã®ããã®æ¥ãåããŠã ã£ãã®ã§ã&ãš|ãšããäžæåéãã®èšå·ãå
šãå¥ã®æå³ãæã€ããšãç¥ãããçŽ çŽã«ééããŸãããTypeScriptå
¬åŒãã³ãããã¯ã®Union Typesã®ããŒãžãåŸããèªãã§ãããããè
ã«èœã¡ãŸããã
転æ4: typeof nullã®çœ ãšãæå³ã®ãªãtry/catch
nullå€å®ãšããã¡ã€ã«æžã蟌ã¿åŠçã®ãšã©ãŒãã³ããªã³ã°ã§ããããããåéããããŠããŸããã
ãŸãnullå€å®ã§ãã
if (typeof dormantedTimeMs == null) { // â æå³éãã«åããªã
return false
}
-
åœåæ¡:
typeof dormantedTimeMs == nullã§nullå€å®ãããããšãã -
æ°ã¥ããããš:
typeof nullã¯JavaScriptã®æåãªçœ ã§ãå®ã¯"object"ãšããæååãè¿ããã€ãŸããã®æ¯èŒåŒã¯çãéãã«ã¯æ©èœããªã(MDNã®typeofæŒç®åã®ããŒãžã«ããã®æåãæèšãããŠãã) -
çŽããå
容:
dormantedTimeMs == nullã®ããã«ãå€ãã®ãã®ãçŽæ¥æ¯èŒããæžãæ¹ã«å€æŽãã
ããäžã€ããã¡ã€ã«æžã蟌ã¿åŠçwriteJsonFileã«ããæå³ã®ãªãtry/catchãæžããŠããŸããã
export function writeJsonFile(path: string, data: unknown): string {
try {
const json = JSON.stringify(data)
fs.writeFileSync(path, json)
return path
} catch (e) {
throw e // â äœãå å·¥ããŠããªããçŽ éãã®catch
}
}
-
åœåæ¡:
try/catchã§å²ã¿ãcatchã®äžã§ãã®ãŸãŸthrowãçŽã - æ°ã¥ããããš: ãšãã£ã¿ã®ESLintãããUnnecessary try/catch wrapperããšææãããããã£ããããŠãäœãå å·¥ããŠããããæžãæå³ããªãã£ã
-
çŽããå
容:
try/catchèªäœãåé€ããfs.writeFileSyncã®ãšã©ãŒãèªç¶ã«åŒã³åºãå ãžäŒæãã圢ã«ãã
export function writeJsonFile(path: string, data: unknown): string {
- try {
- const json = JSON.stringify(data)
- fs.writeFileSync(path, json)
- return path
- } catch (e) {
- throw e
- }
+ const json = JSON.stringify(data)
+ fs.writeFileSync(path, json)
+ return path
}
ãå°æ¥ã®ãšã©ãŒãã³ããªã³ã°ã®åãç¿ãšããŠæ®ããŠããããããšããæ°æã¡ã§æžããã©ãããŒã ã£ãã®ã§ãããå®éã«ã¯åŠçãçŽ éããããŠããã ãã§ãäœã®åãç¿ã«ããªã£ãŠããŸããã§ãããããŒã«ã«ææãããŠåããŠèªèŠããããšããç¹ã§ã¯å°å³ã«å¹ããåŠã³ã§ãã
æ¯ãè¿ã£ãŠäœãå ±éããŠããã
4ã€ã®è»¢æã䞊ã¹ãŠã¿ããšãå®ã¯ã©ããåã圢ãããŠããŸããã
| # | åœåæ¡ | èŠçŽãåŸ | å ±éããåå |
|---|---|---|---|
| 1 |
services=ãŸãšã圹ãflows=åå¥æäœ |
services=å奿äœãflows=ãŸãšã圹 |
çšèªã ãèŠããŠã責åã®éããèŠããŠããªãã£ã |
| 2 | COMåŽjsonã«è€æ°ã®æ å ±ãæããã |
{ id: number }ã®ã¿ã«çµã |
ããã£ãã䟿å©ãã§ä»ã®å±€ã®è²¬åãŸã§æ±ã蟌ãããšãã |
| 3 | number & null |
number | null |
èšå·ã®æå³ã確èªãããçŽæã§æžãã |
| 4 |
typeof x == null / çŽ éãã®try/catch
|
çŽæ¥æ¯èŒ / try/catchåé€ |
ãåãããã«èŠãããæžãæ¹ãæ€èšŒããã«æ¡çšãã |
ãŸãšãããšãä»åã®ã€ãŸããã¯ã»ãŒå
šéšãããã¯æ¬åœã«èªå(ãã®é¢æ°ã»ãã®ãã¡ã€ã«)ã®è²¬åããã確èªããªããŸãŸæžãé²ããçµæã§ãããCOMåŽjsonã®è²¬åããTypeScriptã®åã®æå³ããnullå€å®ã®æžãæ¹ããtry/catchã®èŠåŠããçµå±ã¯ãããã¯èª°ã®ä»äºãã»äœãæå³ããèšå·ãããäžåºŠç«ã¡æ¢ãŸã£ãŠç¢ºèªããã°é²ãããã¹ã°ããã§ããèšèšãã§ãŒãºã§ãããããã£ãŠããã責åã®åé¢ããšããèãæ¹ããå®è£
ã®äžè¡äžè¡ã«ãŸã§ãã®ãŸãŸå¹ããŠããããšã宿ãã忥ã§ããã
次å
#0010 Workspace管çå®è£
ç·š(ç¶ã)
ä»åã¯COMåŽjsonã®èšèšãšwriteJsonFileãŸã§é²ã¿ãŸãããæ¬¡åã¯readJsonFileãšworkspaceDb.ts(SQLiteæžã蟌ã¿)ã«çæããäºå®ã§ãã
GitHub
AIã®å©çšã«ã€ããŠ
ãã®èšäºã¯ãClaudeã«äžæ¬¡çš¿ãäœæããŠããããå 容ã確èªã»ä¿®æ£ãããã®ã§ããèšèšå€æãã®ãã®ã¯èªåã§è¡ã£ãŠãããå®è£ ã³ãŒããèªåã®æã§æžããŠããŸããClaudeã®äœ¿ãæ¹ã«ã€ããŠã¯çªå€ç·š1ã«è©³ããæžããŠããŸãã