TypeScript ã«ãããå倿ã®ãã¹ãŠïŒå®å šå¶èŠã¬ã€ã
TypeScript ã䜿ã£ãŠãããšãã³ã³ãã€ã©ãåãæ£ããæšè«ã§ããªãã£ãããéçºè ãããæ£ç¢ºãªåãææ¡ããŠããå ŽåããããŸããDHHïŒDavid Heinemeier HanssonïŒãâ¯hotwired/turboâ¯ãããžã§ã¯ãã§ TypeScript ãé€å»ãããTypeScript ã¯æ¬åœã«å¿ èŠãªã®ãïŒããšããè°è«ãåçããŸãããããããå€§èŠæš¡ãããžã§ã¯ãã«ãã㊠TypeScript ã®éçåã·ã¹ãã ãããããä¿¡é Œæ§ã¯äŸç¶ãšããŠé åçã§ãã
ãã®ãããªåã·ã¹ãã ãããã«æè»ãã€åŒ·åã«äœ¿ãããªãããã«ã¯ããå倿ïŒTypeâ¯CastingïŒããŸãã¯ãåæèšïŒTypeâ¯AssertionïŒãã®çè§£ãäžå¯æ¬ ã§ããæ¬èšäºã§ã¯ TypeScript ã®ããŸããŸãªåå€æææ³ãèŠãŠãããåç¶æ³ã«å¿ããæé©ãªæ¹æ³ãéžã¶åºæºãæç€ºããŸãã
ãŸããéèŠãªç¹ãæŒãããŠãããŸããããTypeScript ã®å倿ã¯ã©ã³ã¿ã€ã ã§å€ã®å®éã®åœ¢ãå€ãããã®ã§ã¯ãããŸããããããŸã§ ã³ã³ãã€ã«æã«åãã§ãã«ã«ããã®å€ã¯ç§ãæå®ãããã®åãšããŠæ±ã£ãŠãã ããããšäŒããè¡çº ã§ããã©ã³ã¿ã€ã ã®ã³ãŒãã«ã¯äœã®åœ±é¿ãäžããŸããã
asïŒãã£ãšãåºæ¬çãªåæèš
as ããŒã¯ãŒã㯠TypeScript ã§æãäžè¬çã«äœ¿ãããåæèšæ§æã§ããéçºè
ãã³ã³ãã€ã©ããåãããç¥ã£ãŠãããšãããã®ç¢ºä¿¡ã®ããšåãæå®ã§ããŸããç¹ã« any ã unknown ã®ããã«åæ
å ±ããªãå€ãå
·äœçãªåãšããŠæ±ãå Žåã«äŸ¿å©ã§ãã
interface Hero {
name: string;
age: number;
}
const capt = {} as Hero; // 空ãªããžã§ã¯ãã Hero åãšããŠæèš
capt.name = 'ãã£ããã³';
capt.age = 100;
ã¡ãªã¿ã«ãJSXïŒTSXïŒãšãšãã«äœ¿ããšãã¯ãå±±æ¬åŒ§ïŒ<Type>ïŒæ§æã JSX ã¿ã°ãšæ··åãããå¯èœæ§ããããããas ããŒã¯ãŒãã䜿çšããã®ãæšæºã®ããã«ãªã£ãŠããŸãããã²èŠããŠãããŠãã ããïŒ
as constïŒå€ããªãã©ã«åãšããŠåºå®ãã
as const ã¯å€æ°ããªããžã§ã¯ãããŸãã§ const 宣èšãããã®ããã«æ±ãããã¹ãŠã®ããããã£ã readonly ã«å€ããå€ãéåžžã«å
·äœç㪠ãªãã©ã«å ã«åºå®ããŸãã
// éåžžã®å Žåã'direction' ã®å㯠'string' ãšæšè«ãããŸãã
let direction = "left";
// 'as const' ã䜿ããšåã "left" ãšãããªãã©ã«åã«åºå®ãããŸãã
const directionConst = "left" as const;
// directionConst ã®å: "left"
const config = {
method: "GET",
cache: false,
} as const;
/*
config ã®å:
{
readonly method: "GET";
readonly cache: false;
}
*/
ãã®ããã«ããããšã§ããªããžã§ã¯ãã®ããããã£ã誀ã£ãŠå€æŽãããããšãé²ããŸãããç¹å®ã®æååå€ã®ã¿ã蚱容ãã颿°ã®åŒæ°ã«æž¡ããšãã«åã®å®å šæ§ãé«ããããšãã§ããŸãã
!ïŒNonânull æèšæŒç®å
! æŒç®åã¯ãããå€ã null ãŸã㯠undefined ã§ã¯çµ¶å¯Ÿãªããšã³ã³ãã€ã©ã«åŒ·ã䞻匵ããããšãã«äœ¿ããŸããDOM èŠçŽ ã«ã¢ã¯ã»ã¹ãããšããªã©ãéçºè
ããã®èŠçŽ ãå¿
ãååšãããšç¢ºä¿¡ããŠããç¶æ³ã§æå¹ã§ãã
// ã³ã³ãã€ã©ã¯ querySelector ã null ãè¿ãå¯èœæ§ããããšèŠåããŸãã
const el = document.querySelector("input")!; // '!' ã§ null ã§ã¯ãªããšæèš
el.focus(); // ããã§ el ã null ã§ã¯ãªããšã¿ãªããããšã©ãŒã«ãªããŸããã
ãã ããã®æ¹æ³ã¯æ
éã«äœ¿ãã¹ãã§ããããã©ã³ã¿ã€ã ã§å®éã«å€ã null ã ã£ãå Žåãã³ãŒãã¯ãšã©ãŒãèµ·ãããŠåæ¢ããŸãã! 㯠ã³ã³ãã€ã©ã®æçšãªèŠåãç¡èŠããè¡çº ãªã®ã§ãæ¬åœã« 100ïŒ
確信ã§ããç¶æ³ã§ã ã䜿ãã®ãè¯ãã§ãããã
satisfiesïŒåãå®ãã€ã€æšè«ã¯æŽ»ãã
ES2022 ã«å°å
¥ããã satisfies æŒç®åã¯ãas ã®æ¬ ç¹ãè£ãéåžžã«è³¢ãææ³ã§ããããå€ãç¹å®ã®åããæºãããŠãã (satisfy)ããããã§ãã¯ããªããããå€ãã®ãã®ã®å
·äœç㪠ãªãã©ã«åæšè«ã¯ãã®ãŸãŸç¶æããŠãããŸãã
as ã䜿ããšåã匷å¶çã«åºå®ãããŠãããšã®å
·äœçãªåæ
å ±ã倱ã£ãŠããŸãããšããããŸããããã satisfies ã¯åãã§ãã¯ãééããã€ã€ãåæšè«ã®å©ç¹ããã¹ãŠäº«åã§ããã®ã§ãã
type Config = { method: "GET" | "POST"; url: string };
// 'as' ã䜿ã£ãå Žå
const apiConfigAs = {
method: "GET",
url: "/users",
} as Config;
// apiConfigAs.method ã®å㯠"GET" | "POST" ã«æ¡åŒµãããŸãã
// 'satisfies' ã䜿ã£ãå Žå
const apiConfigSatisfies = {
method: "GET",
url: "/users",
} satisfies Config;
// apiConfigSatisfies.method ã®å㯠"GET" ãªãã©ã«åãšããŠç¶æãããŸãïŒ
ãããªããžã§ã¯ãã« Config åã«ãªãããããã£ã远å ãããªããsatisfies ã¯ã³ã³ãã€ã«ãšã©ãŒãçºçãããŠãã¹ãé²ããŸãããã®ããã«ãåãã§ãã¯ãšåæšè«ã®äž¡æ¹ã®å©ç¹ãåŸãããšããsatisfies ã¯æé«ã®éžæãšèšããã§ãããã
äºéæèš (Double Assertion)
é¢é£ã®ãªãåå士ã¯çŽæ¥å倿ãã§ããŸããããããªãšãã« unknownïŒãŸã㯠anyïŒãäžéã®æ©æž¡ãã«äœ¿ããäºéæèšãææ³ã䜿ãããšããããŸãã
const value: string = "123";
// ãšã©ãŒïŒstring åã number åã«çŽæ¥å€æã§ããŸããã
// const num = value as number;
// äºéæèšïŒ string -> unknown -> number
const num = value as unknown as number; // å±éºã§ãããã³ã³ãã€ã©ãééããŸãã
ãã®æ¹æ³ã¯åãã§ãã«ãå®å šã«åé¿ãããã®ãªã®ã§éåžžã«å±éºã§ããã³ãŒããå®éã«äœãããŠããããæ£ç¢ºã«çè§£ããŠãããä»ã«æ¹æ³ããªããšãã®æåŸã®ææ®µãšããŠã®ã¿äœ¿ãã¹ãã§ããã»ãšãã©ã®å Žåã¯ãŠãŒã¶ãŒå®çŸ©åã¬ãŒãïŒæ¬¡ç« ã§èª¬æïŒãªã©ã§ããå®å šã«è§£æ±ºã§ããŸãã
isïŒãŠãŒã¶ãŒå®çŸ©åã¬ãŒãã§åãçµã
æ¡ä»¶æã䜿ã£ãŠåãçµãããšããåã¬ãŒã (Typeâ¯Guard)ããšèšããŸããtypeofãinstanceof ãªã©ã代衚çã§ããããããããã«é²ãã§ãis ããŒã¯ãŒãã䜿ãããšã§ ãŠãŒã¶ãŒå®çŸ©åã¬ãŒã颿° ãäœãããšãã§ããŸããè€éãªãªããžã§ã¯ãã®åå€å¥ããžãã¯ã颿°ã«åãåºããã³ãŒãã®åå©çšæ§ãšå¯èªæ§ãé«ããããšãå¯èœã§ãã
// 'value is string' ã¯ããã®é¢æ°ã true ãè¿ãããªã value ã®åã string ã§ããããšãä¿èšŒããŸãã
function isString(value: unknown): value is string {
return typeof value === "string";
}
function print(value: unknown) {
if (isString(value)) {// ãã®ãããã¯å
ã§ value 㯠string åãšããŠå®å
šã«æ±ããŸããconsole.log(value.toUpperCase());
}
}
ãã®ããã« is ãæŽ»çšãããšãè€éãªæ¡ä»¶ä»ãåããžãã¯ãæç¢ºãã€å®å
šã«ç®¡çããããšãã§ããŸãã
ããè¯ãã³ãŒãã®ããã®æèš
TypeScript ã®å倿ã¯åŒ·åãªããŒã«ã§ãããä¹±çšãããšåã·ã¹ãã ã®å©ç¹ãæãªãããšã«ãªããŸãããç§ã¯ã³ã³ãã€ã©ããè³¢ãããšããèªä¿¡ãå¿ èŠãªå Žé¢ããããŸãããã»ãšãã©ã®å Žåã³ã³ãã€ã©ã®èŠåã«ã¯çç±ããããŸãã
å倿ã䜿ãåã«æ¬¡ã®ããšããŸãèããŠã¿ãŠãã ããã
- åã¬ãŒãïŒ
typeofãinstanceofãinãŸãã¯ãŠãŒã¶ãŒå®çŸ©is颿°ïŒã§åãå®å šã«çµããªããïŒ satisfiesæŒç®å ã䜿ã£ãŠåãã§ãã¯ãšåæšè«ã®äž¡æ¹ãæºãããªããïŒ- ãžã§ããªã㯠(Generic) ã䜿ã£ãŠãã£ãšæè»ãªåæ§é ãäœããªããïŒ
ããããæ€èšãçµãäžã§ããªãå倿ãå¿ èŠãªã®ã§ããã°ããã®æå³ãšæœåšçãªãªã¹ã¯ãæ£ããçè§£ããŠäœ¿çšããŠãã ããïŒ æ£ãã䜿ãããåæèšã¯ãããªãã® TypeScript ã³ãŒããäžæ®µäžã®ã¬ãã«ã«å°ããŠãããŸãã
TypeScript ã䜿ãããã§ã次ã®äºã€ã®æ ŒèšããããŸãã
anyã䜿ããªã- åæèšã䜿ããªã
ããããæ¬åœã«ç¢ºä¿¡ããããšãã«åæèšã䜿ãããšã¯ãã³ãŒãäœæãæ Œæ®µã«æ©ããããšãã§ããŸããïŒ