ç§»è¡æŠç¥
å€§èŠæš¡ãªãããžã§ã¯ããJavaScriptããTypeScriptã«å€æããããšã¯å°é£ã§ããããã解決ããåã«ãJSããTSã«åãæ¿ããããã®2ã€ã®æŠç¥ãæ€èšããŸããã
â1ããã€ããªããç§»è¡æŠç¥
ãã®ã¢ãããŒãã§ã¯ããããžã§ã¯ãã®TypeScriptãžã®ãã¡ã€ã«ããšã®æ®µéçãªå€æãå®è¡ãããŸãããã®ããã»ã¹äžã«ããã¡ã€ã«ãç·šéãããå ¥åãšã©ãŒãä¿®æ£ããããããžã§ã¯ãå šäœãTSã«å€æããããŸã§ãã®ããã«æ©èœããŸããallowJSãã©ã¡ãŒã¿ãŒã䜿çšãããšããããžã§ã¯ãã«TypeScriptãã¡ã€ã«ãšJavaScriptãã¡ã€ã«ã®äž¡æ¹ãå«ããããšãã§ããŸãããã®ãããã§ãJSãããžã§ã¯ããTSã«å€æãããã®ã¢ãããŒãã¯éåžžã«å®è¡å¯èœã§ãã
ãã€ããªããç§»è¡æŠç¥ã§ã¯ãéçºããã»ã¹ãäžæåæ¢ããå¿ èŠã¯ãããŸããããã¡ã€ã«ããšã«æ®µéçã«ãããžã§ã¯ããTypeScriptã«å€æã§ããŸããããããå€§èŠæš¡ãªãããžã§ã¯ãã«ã€ããŠè©±ãå Žåããã®ããã»ã¹ã«ã¯é·ãæéããããå¯èœæ§ããããŸãããŸããçµç¹å šäœã®ããã°ã©ããŒåãã®ãã¬ãŒãã³ã°ãå¿ èŠã§ããããã°ã©ããŒã¯ããããžã§ã¯ãã®è©³çްã玹ä»ããå¿ èŠããããŸãã
â2ãå æ¬çãªç§»è¡æŠç¥
ãã®ã¢ãããŒãã§ã¯ãå®å šã«JavaScriptã§èšè¿°ããããããžã§ã¯ãããŸãã¯ãã®äžéšãTypeScriptã§èšè¿°ããããããžã§ã¯ãã䜿çšããŠããããTypeScriptãããžã§ã¯ãã«å®å šã«å€æããŸãããã®å Žåãã¿ã€ã
anyãšã³ã¡ã³ãã䜿çšããå¿
èŠããããŸã@ts-ignoreãããã«ããããããžã§ã¯ãããšã©ãŒãªãã§ã³ã³ãã€ã«ã§ããŸããããããæéã®çµéãšãšãã«ãã³ãŒããç·šéããŠãããé©åãªã¿ã€ãã䜿çšããããã«é²ãããšãã§ããŸãã
å æ¬çãªTypeScriptç§»è¡æŠç¥ã«ã¯ããã€ããªããæŠç¥ã«æ¯ã¹ãŠããã€ãã®éèŠãªå©ç¹ããããŸãã
- . , , . , TypeScript, , .
- , . , , , . .
äžèšãèæ ®ãããšããã¹ãŠã®ç¹ã§ãããŒãã€ã·ãç§»è¡ã¯ãã€ããªããç§»è¡ãããåªããŠããããã«æãããŸããããããæçããã³ãŒãããŒã¹ãå æ¬çãªæ¹æ³ã§TypeScriptã«å€æããããšã¯ãéåžžã«å°é£ãªäœæ¥ã§ããããã解決ããããã«ãã³ãŒãã倿Žããã¹ã¯ãªããããããããcodemodsãïŒcodemodsïŒã«é Œãããšã«ããŸããããããžã§ã¯ããTypeScriptã«æåã«å€æãå§ãããšãããããæåã§è¡ã£ããšããèªååã§ããå埩æäœã«æ°ã¥ããŸããããããã®æäœããšã«ã³ãŒãmodãäœæãããããã1ã€ã®ç§»è¡ãã€ãã©ã€ã³ã«çµåããŸããã
çµéšã«ããã°ããããžã§ã¯ããTypeScriptã«èªå倿ããåŸããšã©ãŒãçºçããªãããšã100ïŒ ç¢ºä¿¡ããããšã¯ã§ããŸããããããã以äžã§èª¬æããæé ã®çµã¿åãããæè¯ã®çµæããããããæçµçã«ããšã©ãŒã®ãªãTypeScriptãããžã§ã¯ããåŸãããããšãããããŸããã code modsã䜿çšããŠã50,000è¡ãè¶ ããã³ãŒããå«ã¿ã1,000ãè¶ ãããã¡ã€ã«ã§è¡šããããããžã§ã¯ããTypeScriptã«å€æããããšãã§ããŸããããããè¡ãã®ã«1æ¥ããããŸããã
次ã®å³ã«ç€ºããã€ãã©ã€ã³ã«åºã¥ããŠãts-migrateããŒã«ãäœæããŸããã

Ts-migrate codemods
Airbnbã®ããã³ããšã³ãã®å€§éšåã¯ã Reactã䜿çšããŠèšè¿°ãããŠããŸããããããã³ãŒãmodã®äžéšãReactåºæã®æŠå¿µã«é¢é£ããŠããçç±ã§ããts-migrateããŒã«ã¯ãä»ã®ã©ã€ãã©ãªãŸãã¯ãã¬ãŒã ã¯ãŒã¯ã§äœ¿çšã§ããŸãããããã«ã¯è¿œå ã®æ§æãšãã¹ããå¿ èŠã«ãªããŸãã
ç§»è¡ããã»ã¹ã®æŠèŠ
ãããžã§ã¯ããJavaScriptããTypeScriptã«å€æããããã«åŸãå¿ èŠã®ããåºæ¬çãªæé ãèŠãŠãããŸãããããããã®æé ãã©ã®ããã«å®è£ ãããŠãããã«ã€ããŠè©±ããŸãããã
âã¹ããã1
ãã¹ãŠã®TypeScriptãããžã§ã¯ããæåã«äœæããã®ã¯
tsconfig.jsonã§ããTs-migrateã¯ãå¿
èŠã«å¿ããŠç¬èªã«å®è¡ã§ããŸãããã®ãã¡ã€ã«ã«ã¯æšæºã®ãã³ãã¬ãŒãããããŸããããã«ããã¹ãŠã®ãããžã§ã¯ããäžè²«ããŠæ§æãããŠããããšã確èªããããã®æ€èšŒã·ã¹ãã ãå°å
¥ãããŠããŸããåºæ¬çãªæ§æã®äŸã次ã«ç€ºããŸãã
{
"extends": "../typescript/tsconfig.base.json",
"include": [".", "../typescript/types"]
}
âã¹ããã2
ãã¡ã€ã«
tsconfig.jsonãæ¬æ¥ããã¹ãå Žæã«é
眮ããããšããœãŒã¹ãã¡ã€ã«ã®ååã倿ŽãããŸããã€ãŸãã.js /.jsxæ¡åŒµåã¯.ts / .tsxã«å€æŽãããŸãããã®ã¹ãããã¯éåžžã«ç°¡åã«èªååã§ããŸããããã«ãããå€ãã®æäœæ¥ãåãé€ãããšãã§ããŸãã
âã¹ããã3
次ã«ãã³ãŒãmodãå®è¡ããŸãããããããã©ã°ã€ã³ãšåŒã³ãŸããts-migrateã®ãã©ã°ã€ã³ã¯ãTypeScriptèšèªãµãŒããŒãä»ããŠè¿œå æ å ±ã«ã¢ã¯ã»ã¹ã§ããã³ãŒãmodã§ãããã©ã°ã€ã³ã¯æååãå ¥åãšããŠåãå ¥ãã倿Žãããæååãè¿ããŸããjscodeshiftããŒã«ããã¯ã¹ãTypeScript APIãæåååŠçããŒã«ããŸãã¯ãã®ä»ã®AST倿ŽããŒã«ã䜿çšããŠãã³ãŒã倿ãå®è¡ã§ããŸãã
äžèšã®åæé ãå®äºããåŸãGitå±¥æŽã«ä¿çäžã®å€æŽããããã©ããã確èªãããããããããžã§ã¯ãã«å«ããŸããããã«ãããç§»è¡PRãã³ãããã«åå²ã§ãããããäœãèµ·ãã£ãŠããã®ããçè§£ãããããªãããã¡ã€ã«åã®å€æŽã远跡ããã®ã«åœ¹ç«ã¡ãŸãã
ts-migrateãæ§æããããã±ãŒãžã®æŠèŠ
ts-migrateã3ã€ã®ããã±ãŒãžã«åå²ããŸãã
ããã«ãããã³ãŒã倿ããžãã¯ãã·ã¹ãã ã®ã³ã¢ããåé¢ããããŸããŸãªåé¡ã解決ããããã«èšèšãããå€ãã®æ§æãäœæããããšãã§ããŸãããããã§ãç§»è¡ãšåç¡èŠãšãã2ã€ã®äž»èŠãªæ§æãã§ããŸããã
æ§æãé©çšããç®çã¯
migrationããããžã§ã¯ããJavaScriptããTypeScriptã«å€æããããšã§ãããŸãããã®æ§æreignoreã¯ããã¹ãŠã®ãšã©ãŒãç¡èŠããã ãã§ãããžã§ã¯ããã³ã³ãã€ã«ã§ããããã«ããããã«äœ¿çšãããŸãããã®æ§æã¯ãã³ãŒãããŒã¹ã倧ãããæ¬¡ã®ããã«ããŸããŸãªããšãè¡ãå Žåã«åœ¹ç«ã¡ãŸãã
- TypeScriptããŒãžã§ã³ã®æŽæ°ã
- ã³ãŒãã«å€§ããªå€æŽãå ããããã³ãŒãããŒã¹ããªãã¡ã¯ã¿ãªã³ã°ããŸãã
- ããã€ãã®äžè¬çã«äœ¿çšãããã©ã€ãã©ãªã®æ¹è¯ãããã¿ã€ãã
ãã®ã¢ãããŒãã§ã¯ãããã«å¯ŸåŠããäºå®ã®ãªãã³ã³ãã€ã«ãšã©ãŒãçæãããå Žåã§ãããããžã§ã¯ããTypeScriptã«å€æã§ããŸããããã«ãããTypeScriptãŸãã¯ã³ãŒãã§äœ¿çšãããŠããã©ã€ãã©ãªã®æŽæ°ãç°¡åã«ãªããŸãã
ã©ã¡ãã®æ§æããæ¬¡ã®
ts-migrate-server2ã€ã®éšåãããªããµãŒããŒã§å®è¡ãããŸãã
- TSServerïŒãµãŒããŒã®ãã®éšåã¯ãVSCodeããšãã£ã¿ãŒãšèšèªãµãŒããŒéã®éä¿¡ã«äœ¿çšãããã®ãšéåžžã«ãã䌌ãŠããŸããTypeScriptèšèªãµãŒããŒã®æ°ããã€ã³ã¹ã¿ã³ã¹ã¯ãå¥ã®ããã»ã¹ã§éå§ãããŸããéçºããŒã«ã¯ãèšèªãããã³ã«ã䜿çšããŠãããšå¯Ÿè©±ããŸãã
- ç§»è¡ããŒã«ïŒããã¯ãç§»è¡ããã»ã¹ãå®è¡ãããã®ããã»ã¹ã調æŽããã³ãŒãã§ãããã®ããŒã«ã¯æ¬¡ã®ãã©ã¡ãŒã¿ãåããŸãã
interface MigrateParams {
rootDir: string; // .
config: MigrateConfig; // ,
// .
server: TSServer; // TSServer.
}
ãã®ããŒã«ã¯æ¬¡ã®ããšãè¡ããŸãã
- ãã¡ã€ã«ãè§£æããŠããŸã
tsconfig.jsonã - ãœãŒã¹ã³ãŒãã䜿çšããŠ.tsãã¡ã€ã«ãäœæããŸãã
- éããã®ãã¡ã€ã«ã蚺æããããã«ã掻åäœã®èšèªã®ãµãŒãã«åãã¡ã€ã«ããããç§ãã¡ã®ã³ã³ãã€ã©ãäžãã蚺æã®3ã€ã®ã¿ã€ããã以äžã®ãšããã§ã
semanticDiagnosticsãsyntacticDiagnosticsãšsuggestionDiagnosticsããããã®ãã§ãã¯ã䜿çšããŠããœãŒã¹ã³ãŒãå ã®åé¡é åãèŠã€ããŸããäžæã®èšºæã³ãŒããšãã¡ã€ã«å ã®è¡çªå·ã«åºã¥ããŠãèããããåé¡ã®ã¿ã€ããç¹å®ããå¿ èŠãªã³ãŒã倿Žãé©çšã§ããŸãã - ãã¹ãŠã®ãã©ã°ã€ã³ã§åãã¡ã€ã«ãåŠçããŸãããã©ã°ã€ã³ã®äž»å°ã§ãã¡ã€ã«å ã®ããã¹ãã倿Žãããå Žåãå ã®ãã¡ã€ã«ã®å å®¹ãæŽæ°ãããã¡ã€ã«ã倿ŽãããããšãèšèªãµãŒããŒã«éç¥ããŸãã
䜿çšäŸ
ts-migrate-serverã¯ãexamplesããã±ãŒãžãŸãã¯ã¡ã€ã³ããã±ãŒãžã«ãããŸãããŸãts-migrate-exampleãåºæ¬çãªãã©ã°ã€ã³ã®äŸãå«ãŸããŠããŸãããããã¯3ã€ã®äž»èŠãªã«ããŽãªã«åé¡ãããŸãã
- jscodeshiftã«åºã¥ããã©ã°ã€ã³ã
- Abstract Syntax TreeïŒASTïŒTypeScriptã«åºã¥ããã©ã°ã€ã³ã
- ããã¹ãããŒã¹ã®ãã©ã°ã€ã³ã
ãªããžããªã«ã¯ãããããã¹ãŠã®çš®é¡ã®åçŽãªãã©ã°ã€ã³ãäœæããããã»ã¹ã瀺ãããšãç®çãšããäžé£ã®äŸãå«ãŸããŠããŸãããŸããcãšã®çµã¿åããã§ã®äœ¿çšã瀺ããŠããŸã
ts-migrate-serverãã³ãŒãã倿ããç§»è¡ãã€ãã©ã€ã³ã®äŸã次ã«ç€ºããŸããæ¬¡ã®ã³ãŒããå
¥åã§åä¿¡ãããŸãã
function mult(first, second) {
return first * second;
}
ãããŠåœŒã¯æ¬¡ã®ããã«è¿°ã¹ãŠããŸãã
function tlum(tsrif: number, dnoces: number): number {
console.log(`args: ${arguments}`);
return tsrif * dnoces;
}
ãã®äŸã§ã¯ãts-migrateã¯3ã€ã®å€æãå®è¡ããŸããã
- ããã¯ããã¹ãŠã®èå¥åã®æåã®é åºãéã«ããŸã
first -> tsrifã - 颿°å®£èšã®ã¿ã€ãã«é¢ããæ
å ±ã远å ããŸããïŒ
function tlum(tsrif, dnoces) -> function tlum(tsrif: number, dnoces: number): numberã - ã³ãŒãã«è¡ã远å ããŸãã
console.log(âargs:${arguments}â);
æ±çšãã©ã°ã€ã³
å®éã®ãã©ã°ã€ã³ã¯ãå¥ã®ããã±ãŒãžts-migrate-pluginsã«ãããŸãããããã®ããã€ããèŠãŠã¿ãŸãããã jscodeshiftã«åºã¥ã2ã€ã®ãã©ã°ã€ã³ããããŸãïŒ
explicitAnyPluginãšdeclareMissingClassPropertiesPluginãjscodeshiftããŒã«ããã¯ã¹ãã§ããŸãããªãã倿ããããšã®ASTã䜿çšããŠãéåžžã®ã³ãŒãã«ãªãã£ã¹ãããã±ãŒãžãããã®é¢æ°toSource()ã䜿çšããŠããã¡ã€ã«ã«å«ãŸããŠãããœãŒã¹ã³ãŒããçŽæ¥æŽæ°ã§ããŸããExplicitAnyPlugin
ãã©ã°ã€ã³ã¯ããã¹ãŠã®ãšã©ãŒãšãããã®ãšã©ãŒãæ€åºãããè¡ã«é¢ããæ å ±ãTypeScriptèšèªãµãŒããŒããååŸããŸããæ¬¡ã«ãã¿ã€ã泚éããããã®è¡ã«è¿œå ãããŸãããã®ã¢ãããŒãã§ã¯ãã¿ã€ãã䜿çšããããããšã©ãŒãä¿®æ£ã§ããŸã
semanticDiagnosticsanyanyã³ã³ãã€ã«ãšã©ãŒãåãé€ãããšãã§ããŸãã
åŠçããåã®ãµã³ãã«ã³ãŒãã¯æ¬¡ã®ãšããã§ãã
const fn2 = function(p3, p4) {}
const var1 = [];
ãã©ã°ã€ã³ã«ãã£ãŠåŠçãããã®ãšåãã³ãŒãã¯æ¬¡ã®ãšããã§ãã
const fn2 = function(p3: any, p4: any) {}
const var1: any = [];
declareMissingClassPropertiesPluginã¯ãšã©ãŒã³ãŒãã§ãã¹ãŠã®èšºæã¡ãã»ãŒãžãåã
2339ïŒããªãã¯äœãæšæž¬ããããšãã§ãããã®ã³ãŒãã®æå³ãããããæ¬ èœããŠããèå¥åãæã€ã¯ã©ã¹ã®å®£èšãèŠã€ããããšãã§ããã°ãïŒïŒãããŠã泚éä»ãã¯ã©ã¹ã®ããã£ã«è¿œå ããŸãanyããã©ã°ã€ã³ã®ååãããES6ã¯ã©ã¹ã«ã®ã¿é©çšå¯èœã§ãããšçµè«ä»ããããšãã§ããŸãã
ãã©ã°ã€ã³ã®æ¬¡ã®ã«ããŽãªã¯ãASTTypeScriptã«åºã¥ããŠããŸããASTãåŠçããããšã«ããããœãŒã¹ãã¡ã€ã«ã«å¯ŸããŠè¡ãããæŽæ°ã®é åãçæã§ããŸãããããã®æŽæ°ã®èª¬æã¯æ¬¡ã®ããã«ãªããŸãã
type Insert = { kind: 'insert'; index: number; text: string };
type Replace = { kind: 'replace'; index: number; length: number; text: string };
type Delete = { kind: 'delete'; index: number; length: number };
å¿ èŠãªæŽæ°ã«é¢ããæ å ±ãçæããåŸã¯ãéã®é åºã§ãã¡ã€ã«ã«å ¥åããã ãã§ãããã®æäœãå®è¡ããåŸãæ°ããããã°ã©ã ã³ãŒããåãåã£ãå Žåã¯ãããã«å¿ããŠãœãŒã¹ã³ãŒããã¡ã€ã«ãæŽæ°ããŸãã
次ã®ããã€ãã®ASTããŒã¹ã®ãã©ã°ã€ã³ãèŠãŠã¿ãŸããããããã¯
stripTSIgnorePluginãšhoistClassStaticsPluginã§ããstripTSIgnorePlugin
ãã©ã°ã€ã³ã¯ãç§»è¡ãã€ãã©ã€ã³ã§äœ¿çšãããæåã®ãã©ã°ã€ã³ã§ãããã¡ã€ã«ãããã¹ãŠã®ã³ã¡ã³ããåé€ããŸãã
@ts-ignoreïŒãããã®ã³ã¡ã³ãã«ãããæ¬¡ã®è¡ã§çºçãããšã©ãŒãç¡èŠããããã«ã³ã³ãã€ã©ãŒã«æç€ºã§ããŸãïŒãJavaScriptã§èšè¿°ããããããžã§ã¯ããTypeScriptã«å€æããå Žåããã®ãã©ã°ã€ã³ã¯ã¢ã¯ã·ã§ã³ãå®è¡ããŸãããããããäžéšãJSã§ãäžéšãTSã§èšè¿°ãããŠãããããžã§ã¯ãïŒããã€ãã®ãããžã§ã¯ããåæ§ã®ç¶æ
ã§ãã£ãïŒã«ã€ããŠè©±ããŠããå Žåãããã¯çç¥ã§ããªãæåã®ç§»è¡ã¹ãããã§ããã³ã¡ã³ããåé€ãããåŸã§ã®ã¿@ts-ignoreãTypeScriptã³ã³ãã€ã©ã¯ä¿®æ£ãå¿
èŠãªèšºæãšã©ãŒã¡ãã»ãŒãžãçæããŸãã
ãã®ãã©ã°ã€ã³ã®å ¥åã«å ¥ãã³ãŒãã¯æ¬¡ã®ãšããã§ãã
const str3 = foo
? // @ts-ignore
// @ts-ignore comment
bar
: baz;
åºåã¯æ¬¡ã®ãšããã§ãã
const str3 = foo
? bar
: baz;
ã³ã¡ã³ã
@ts-ignoreãåé€ããåŸãhoistClassStaticsPluginãã©ã°ã€ã³ãå®è¡ããŸãããã¹ãŠã®ã¯ã©ã¹å®£èšãééããŸãããã©ã°ã€ã³ã¯ãèå¥åãŸãã¯åŒãäžããå¯èœæ§ã倿ããå²ãåœãŠæäœããã§ã«ã¯ã©ã¹ã¬ãã«ã«äžããããŠãããã©ããã確èªããŸãã
é«ãéçºé床ã確ä¿ãããããžã§ã¯ãã®ä»¥åã®ããŒãžã§ã³ãžã®åŒ·å¶çãªããŠã³ã°ã¬ãŒããåé¿ããããã«ãåãã©ã°ã€ã³ãšts-migrateã«äžé£ã®ãŠããããã¹ããæäŸããŸããã
Reacté¢é£ã®ãã©ã°ã€ã³
ãã®åªããããŒã«ã«åºã¥ãreactPropsPlugin ãã©ã°ã€ã³ã¯ãã¿ã€ãæ å ±ãPropTypesããTypeScriptã¿ã€ã宣èšã«å€æããŸãããã®ãã©ã°ã€ã³ã䜿çšãããšãå°ãªããšã1ã€ã®Reactã³ã³ããŒãã³ããå«ã.tsxãã¡ã€ã«ãåŠçããã ãã§æžã¿ãŸãããã®ãã©ã°ã€ã³ã¯ããã¹ãŠã®PropTypes宣èšãæ€çŽ¢ããASTããã³ã®ãããªåçŽãªæ£èŠåŒã䜿çšããŠããŸãã¯/ objectOf $ /ã®ãããªããè€éãªæ£èŠåŒã䜿çšããŠããããè§£æããããšããŸãã React-componentïŒé¢æ°ãŸãã¯ã¯ã©ã¹ã«åºã¥ãïŒãæ€åºããããšãæ°ããã¿ã€ãã䜿çšããŠãã©ã¡ãŒã¿ãŒïŒpropsïŒãå ¥åããã³ã³ããŒãã³ãã«å€æãããŸããReactDefaultPropsPlugin ãã©ã°ã€ã³
/number/type Props = {âŠ};
Reactã³ã³ããŒãã³ãã«defaultPropsãã¿ãŒã³ãå®è£ ãã責任ããããŸããããã©ã«ãå€ãäžããããŠããå ¥åãã©ã¡ãŒã¿ãŒã衚ãããã«ãç¹å¥ãªã¿ã€ãã䜿çšããŸãã
type Defined<T> = T extends undefined ? never : T;
type WithDefaultProps<P, DP extends Partial<P>> = Omit<P, keyof DP> & {
[K in Extract<keyof DP, keyof P>]:
DP[K] extends Defined<P[K]>
? Defined<P[K]>
: Defined<P[K]> | DP[K];
};
ããã©ã«ãå€ãå²ãåœãŠãããŠããå°éå ·ãèŠã€ããŠãåã®æé ã§äœæããã³ã³ããŒãã³ãã®å°éå ·ã説æããã¿ã€ããšçµã¿åãããŸãã
Reactãšã³ã·ã¹ãã ã¯ãç¶æ ãšã³ã³ããŒãã³ãã®ã©ã€ããµã€ã¯ã«ã®æŠå¿µãå¹ åºãå©çšããŠããŸããæ¬¡ã®ããã€ãã®ãã©ã°ã€ã³ã§ã¯ããããã®æŠå¿µã«é¢é£ããåé¡ã«åãçµãã§ããŸãããããã£ãŠãã³ã³ããŒãã³ãã«ç¶æ ãããå ŽåãreactClassStatePluginãã©ã°ã€ã³ã¯æ°ããã¿ã€ãïŒ
type State = any;ïŒãçæããreactClassLifecycleMethodsPluginãã©ã°ã€ã³ã¯ã³ã³ããŒãã³ãã®ã©ã€ããµã€ã¯ã«ã¡ãœããã«å¯Ÿå¿ããã¿ã€ãã®æ³šéãä»ããŸãããããã®ãã©ã°ã€ã³ã®æ©èœã¯ããã©ã°ã€ã³ãanyããæ£ç¢ºãªã¿ã€ãã«çœ®ãæããæ©èœãè£
åãããªã©ããŠæ¡åŒµã§ããŸãã
ãããã®ãã©ã°ã€ã³ã¯ãç¹ã«ãç¶æ ãšããããã£ã®ã¿ã€ããµããŒããæ¡åŒµããããšã§æ¹åã§ããŸãããããããããã®æ¢åã®æ©èœã¯ãçµå±ã®ãšãããå¿ èŠãªæ©èœãå®è£ ããããã®è¯ãåºçºç¹ã§ããããã«ãç§»è¡ã®éå§æã«ãã³ãŒãããŒã¹ãããã¯ããµããŒãããªãå€ãããŒãžã§ã³ã®Reactã䜿çšããŠãããããããã§ã¯Reactããã¯ã䜿çšããŸããã
ãããžã§ã¯ããæ£ããã³ã³ãã€ã«ãããŠããããšã確èªãã
ç§ãã¡ã®ç®æšã¯ãããã°ã©ã ã®åäœã倿Žããã«ãåºæ¬åãåããTypeScriptãããžã§ã¯ããã³ã³ãã€ã«ããããšã§ãã
ãã¹ãŠã®å€æãšå€æŽãè¡ã£ãåŸãã³ãŒãã®ãã©ãŒããããäžåäžã«ãªãå¯èœæ§ããããŸããããã«ããããªã³ã¿ãŒã䜿çšããäžéšã®ã³ãŒããã§ãã¯ã§ãšã©ãŒãæããã«ãªãå¯èœæ§ããããŸããããã³ããšã³ãã³ãŒãããŒã¹ã¯ãPrettierãšESLintã«åºã¥ãã·ã¹ãã ã䜿çšããŠããŸããã€ãŸããPrettierã¯èªåã³ãŒããã©ãŒãããã«äœ¿çšãããESLintã¯ãæšå¥šãããéçºã¢ãããŒãã«æºæ ããŠãããã©ããã³ãŒãããã§ãã¯ããã®ã«åœ¹ç«ã¡ãŸããããã«ãããé©åãªãã©ã°ã€ã³ã䜿çšããã ãã§ã以åã®ã¢ã¯ã·ã§ã³ããçºçããã³ãŒããã©ãŒãããã®åé¡ã«ãã°ãã察åŠã§ããŸãã-
eslintFixPluginã
ç§»è¡ãã€ãã©ã€ã³ã®æåŸã®ã¹ãããã¯ããã¹ãŠã®TypeScriptã³ã³ãã€ã«ã®åé¡ã解決ãããããšã確èªããããšã§ããæœåšçãªãšã©ãŒãèŠã€ããŠä¿®æ£ããããã«ãtsIgnorePluginãã©ã°ã€ã³ã¯ãã³ãŒããšè¡çªå·ã®ã»ãã³ãã£ãã¯èšºæããæ å ±ãååŸã
@ts-ignoreããšã©ãŒã®èª¬æãšãšãã«ã³ã¡ã³ããã³ãŒãã«è¿œå ããŸããããšãã°ã次ã®ããã«ãªããŸãã
// @ts-ignore ts-migrate(7053) FIXME: No index signature with a parameter of type 'string...
const { field1, field2, field3 } = DATA[prop];
// @ts-ignore ts-migrate(2532) FIXME: Object is possibly 'undefined'.
const field2 = object.some_property;
ã·ã¹ãã ã«JSXæ§æãµããŒããè£ åããŸããã
{*
// @ts-ignore ts-migrate(2339) FIXME: Property 'NORMAL' does not exist on type 'typeof W... */}
<Text weight={WEIGHT.NORMAL}>
some text
</Text>
<input
id="input"
// @ts-ignore ts-migrate(2322) FIXME: Type 'Element' is not assignable to type 'string'.
name={getName()}
/>
æå³ã®ãããšã©ãŒã¡ãã»ãŒãžãèªç±ã«äœ¿çšã§ããããããšã©ãŒã®ä¿®æ£ããæ³šæãã¹ãã³ãŒãã¹ããããã®æ€çŽ¢ã容æã«ãªããŸããé¢é£ããã³ã¡ã³ãããšçµã¿åããã
$TSFixMeããšã§ãã³ãŒãã®å質ã«é¢ãã貎éãªããŒã¿ãåéããæœåšçã«åé¡ã®ããã³ãŒããã©ã°ã¡ã³ããèŠã€ããããšãã§ããŸãã$TSFixMeäœæããã¿ã€ããšã€ãªã¢ã¹ã§ãanyããããŠé¢æ°ã®å Žåãããã¯$TSFixMeFunction = (âŠargs: any[]) => any;ã§ããã¿ã€ãã®äœ¿çšã¯é¿ããããšããå§ãããŸãããã¿ã€ãanyã䜿çšãããšç§»è¡ããã»ã¹ãç°¡çŽ åããã®ã«åœ¹ç«ã¡ãŸããããã®ã¿ã€ãã䜿çšãããšãã©ã®ã³ãŒããã©ã°ã¡ã³ããæ¹åããå¿
èŠãããããæ£ç¢ºã«ç¥ãããšãã§ããŸããã
ãã©ã°ã€ã³
eslintFixPluginã2åå®è¡ãããããšã¯æ³šç®ã«å€ããŸããåããŠäœ¿çšããåã«tsIgnorePluginãã©ãŒãããã¯ãã³ã³ãã€ã«ãšã©ãŒãçºçããå Žæã«é¢ããã¡ãã»ãŒãžã«åœ±é¿ãäžããå¯èœæ§ãããããã§ããtsIgnorePluginã³ãŒãã«ã³ã¡ã³ãã远å @ts-ignoreãããšãã©ãŒããããšã©ãŒãçºçããå¯èœæ§ãããããã2åç®ã¯é©çšåŸã§ãã
ãã®ä»ã®æ³šæäºé
äœæ¥äžã«æ°ä»ããããã€ãã®ç§»è¡æ©èœã«æ³šç®ããŠãã ãããããããããããã®æ©èœã«ã€ããŠç¥ã£ãŠãããšããããžã§ã¯ãã§äœæ¥ãããšãã«åœ¹ç«ã¡ãŸãã
- TypeScript 3.7 @ts-nocheck, TypeScript- . , .js-, .ts/.tsx-. , .
- TypeScript 3.9ã§ã¯ã@ ts-expect-errorã³ã¡ã³ãã®ãµããŒããå°å
¥ãããŠããŸããã³ãŒãã®è¡ã®åã«ãã®ãããªã³ã¡ã³ããä»ããŠããå ŽåãTypeScriptã¯å¯Ÿå¿ãããšã©ãŒãå ±åããŸããããã®ãããªè¡ã«ãšã©ãŒããªãå ŽåãTypeScriptã¯ã³ã¡ã³ãã®
@ts-expect-errorå¿ èŠããªãããšãéç¥ããŸããAirbnbã³ãŒãããŒã¹ã¯ã³ã¡ã³ãããã³ã¡ã³ã@ts-ignoreã«ç§»åããŸãã@ts-expect-errorã
çµæ
Airbnbã®ã³ãŒãããŒã¹ã®JavaScriptããTypeScriptãžã®ç§»è¡ã¯ãŸã é²è¡äžã§ãããŸã JavaScriptã³ãŒãã§è¡šãããŠããå€ããããžã§ã¯ããããã€ããããŸãã
$TSFixMeã³ã¡ã³ãã¯ãã³ãŒãããŒã¹ã§ã¯ãŸã äžè¬ç@ts-ignoreã§ãã

Airbnbã®JavaScriptãšTypeScript
ãã ããts-migrateã䜿çšãããšããããžã§ã¯ããJSããTSã«å€æããããã»ã¹ãå€§å¹ ã«å éãããäœæ¥ã®çç£æ§ãå€§å¹ ã«åäžããããšã«æ³šæããŠãã ããã ts-migrateã䜿çšãããšãããã°ã©ããŒã¯åãã¡ã€ã«ãæåã§åŠçããã®ã§ã¯ãªããå ¥åã®æ¹åã«éäžããããšãã§ããŸãããçŸåšãçŽ600äžè¡ã®ã³ãŒããæã€ããã³ããšã³ãã¢ããªããžããªã®çŽ86ïŒ ãTypeScriptã«å€æãããŠããŸããä»å¹Žæ«ãŸã§ã«95ïŒ ã«éãããšèŠèŸŒãã§ããŸãã
ããã®ãããžã§ã¯ããªããžããªã®ããŒã ããŒãžã§ãts-migrateãã€ã³ã¹ããŒã«ããŠå®è¡ããæ¹æ³ãåŠã¶ããšãã§ããŸãã ts-migrateã«åé¡ãããå ŽåããŸãã¯ãã®ããŒã«ãæ¹åããããã®ã¢ã€ãã¢ãããå Žåã¯ããã²ãåå ãã ãããããã«åãçµãããã«ïŒ
å€§èŠæš¡ãªãããžã§ã¯ããJavaScriptããTypeScriptã«å€æããããšããããŸããïŒ
