ͱ5ZQF4DSJQU w ͱͱ"OHVMBS͕͖ w ݄ʹ(PPHMF͕ʮ"OHVMBSY5ZQF4DSJQUʹ͢ ΔΘʔʯͱએݴͨ͠λΠϛϯάͰ5ZQF4DSJQUʹڵຯΛ࣋ͭ w Ͱ7JNͰॻ͖͔ͨͬͨͷͰɺQMVHJOͭ͘Δ IUUQTHJUIVCDPN2VSBNZUTVRVZPNJ w ࣄͰUTॻ͖ͨ͘ͳͬͯϑϩϯτʹδϣϒνΣϯ
ܕνΣοΫͱਪ w ؔTVNͷΓOVNCFSͰ͋Δ͜ͱΛਪ͢Δ function sum(a: number, b: number) { return a + b; } console.log(sum(1, sum(1, 1))); // OK // Argument of type '"a"' is not assignable to // parameter of type 'number' console.log(sum('a', 'b'));
4USJDUDIFDL w TUSJDUΦϓγϣϯʢσϑΥϧτͰPOʣΛ͚͓ͯ͘ͱɺݎ ࿚ͳνΣοΫ͕Մೳʹ function hoge(x?: string) { //Object is possibly 'undefined'. return x.trim(); } function hoge(x?: string) { if (!x) return ""; return x.trim(); // OK }
BMMPXKTDIFDLKT w ৽͘͠ϓϩδΣΫτΛ࡞Δͱ͖ɺTUSJDUͰΑ͍ w Ұํɺطଘͷ+BWB4DSJQUϓϩδΣΫτʹ5ZQF4DSJQUΛಋೖ ͢Δ͜ͱՄೳ w BMMPXKTDIFDLKTΦϓγϣϯΛPOʹ͢ΔͱɺUT͚ͩͰ ͳ͘ɺKTϑΝΠϧΛѻ͏͜ͱͰ͖ΔͷͰɺগͣͭ͠UT ஔ͖͑Δ͜ͱ͕Ͱ͖Δ
ϥΠϒϥϦͷܕఆٛ w ༗໊ͳϥΠϒϥϦOQNJ!UZQFϥΠϒϥϦ໊Ͱܕఆٛ ͕ެ։͞Ε͍ͯΔ npm i @types/node import path from "path"; export function hoge() { const x = path.join("src", "main.ts"); }
FT.PEVMFT*OUFSPQ w Նࠒʹ/PEFKTͷ&4.PEVMFTʹ͍ͭͯͷऔѻʹಈ ͖͕͋ͬͨͷΛड͚ͯɺWYͰಋೖ͞ΕͨΦϓγϣϯ w ৄ͘͠IUUQTUFQQFJTIBUFOBCMPHDPNFOUSZ FTNPEVMFTJOOPEFKTͳͲΛࢀর w &4.PEVMFT͔Β$PNNPO+4NPEVMFΛJNQPSU͢Δࡍ EFGBVMUJNQPSUΛΘͶͳΒͳ͍
FT.PEVMFT*OUFSPQ w /PEFKTͰɺ$PNNPO+4͔ΒOBNFEJNQPSU͢ΔͱΤ ϥʔʹ /* hoge.mjs */ import { readFile } from "fs"; $ node --experimental-modules hoge.mjs SyntaxError: The requested module does not provide an export named ‘readFile' at checkComplete (internal/loader/ModuleJob.js:75:27) at moduleJob.linked.then (internal/loader/ModuleJob.js: 58:11) at
FT.PEVMFT*OUFSPQ w Ұํɺ5ZQF4DSJQUͰඇ&4.PEVMFT͔ΒͷEFGBVMU JNQPSUར༻Ͱ͖ͳ͔ͬͨͨΊɺ$PNNPO+4ΛJNQPSU͢ ΔʹɺOBNFEJNQPSUͰهड़͢Δ͔͠ͳ͔ͬͨ import * as fs from "fs"; import { readFile } from "fs";
FT.PEVMFT*OUFSPQ w WYҎ߱Ͱɺ$PNNPO+4͔ΒͷEFGBVMUJNQPSU͕ڐ༰͞ ΕΔΑ͏ʹͳͬͨ w ैདྷͷOBNFEJNQPSUͷॻ͖ํґવڐ༰͞Ε͍ͯΔͷ ͷɺ5ZQF4DSJQUެࣜʹEFGBVMUJNQPSUͷॻ͖ํΛਪͯ͠ ͍Δɻ IUUQTXXXUZQFTDSJQUMBOHPSHEPDTIBOECPPLSFMFBTF OPUFTUZQFTDSJQUIUNMTVQQPSUGPSJNQPSUEGSPN DKTGPSNDPNNPOKTNPEVMFTXJUIFTNPEVMFJOUFSPQ import fs from "fs";
.BQQFE5ZQF.PEJpFS w WYͰಋೖ w ैདྷͷ.BQQFE5ZQFͰɺSFBEPOMZ Λ༩͢Δ͜ͱ Ͱ͖ͯɺղআ͢Δ͜ͱͰ͖ͳ͔ͬͨ type Optional = { [P in keyof T]?: T[P] }; type ReadOnly = { readonly [P in keyof T]: T[P] };
XJUINPEJpFS type Strict = { [P in keyof T]-?: T[P] }; // Property 'name' is missing in type '{}' // but required in type 'Strictundefined; }>'. const x: Strict = { };
$POEJUJPOJONBQQFEUZQFT w %J⒎,FZLFZPG5
LFZPG6ʮܕ5ͷLFZશମ͔Βɺܕ6 ͷLFZશମͷू߹ΛҾ͍ͨू߹ʯ w .BQQFE5ZQF͋ΔLFZͷू߹ʹର͢ΔϓϩύςΟͷϚο ϐϯά type $Diff = { [P in DiffKey]: T[P]; };
5ZQFJOGFSFODFJO DPOEJUJPOBMUZQFT w WYͰ$POEJUJPOBM5ZQFTͱಉ࣌ʹϦϦʔε͞Εͨػೳ w $POEJUJPOBM5ZQFTͷ݅෦ʹͯϚονϯά࣌ʹਪ͞ ΕͨܕΛ࠶ར༻Ͱ͖ΔΑ͏ʹ T extends MyCondition ? SomeType : Y;
*OGFSBOE$BQUVSF w 5͕ؔͰ͋ΕɺͦͷΓͱͯ͠ਪ͞ΕΔܕ͕3ʹ֨ ೲ͞ΕΔ type Return = T extends (...args: any[]) => infer R ? R : never; let r: Return number>; // typeof r = number
͍͗͢ʹҙ w $POEJUJPOBM5ZQFTͱ5ZQF*OGFSFODF SZʹΑͬͯɺطଘ ͷܕఆ͔ٛΒ৽͘͠ܕΛ࡞Δखஈ͕֨ஈʹ্ w ॻ͍ͯΔͱ͖ύζϧײ֮Ͱָ͍͠ͷͷɺదͳ༻๏ɾ ༰ྔΛ৺͕͚ͨ΄͏͕Α͍ w Τϥʔϝοηʔδ͕ͲΜͲΜಡΈͮΒ͘ͳΔ w ϨϏϡΞ͕ͨ·ͬͨΜ͡Όͳ͍
VOLOPXOUZQF w WYͰಋೖ w VOLOPXOͯ͢ͷܕ͕BTTJHOBCMF w VOLOPXOUZQFɺUZQFBTTFSUJPO͠ͳ͍ͱԿͰ͖ͳ͍ function hoge(x: unknown) { if (typeof x === "string") { console.log(x.toLowerCase()); } } hoge(10); hoge("foo");
5VQMFTJOSFTUQBSBNFUFST BOETQSFBEFYQSFTTJPOT w WYͰɺؔҾʹؔ͢Δܕͷهड़ྗ͕ڧԽ͞Εͨ w 3FTUQBSBNFUFSTXJUIUVQMFUZQFT w 4QSFBEFYQSFTTJPOTXJUIUVQMFUZQFT w (FOFSJDSFTUQBSBNFUFST w 0QUJPOBMFMFNFOUTJOUVQMFUZQFT w 3FTUFMFNFOUTJOUVQMFUZQFT
4QSFBEFYQSFTTJPOTXJUI UVQMFUZQFT w 4QSFBE0QFSBUPSʹΑΔؔݺͼग़͠ʹରԠ ҎલDPNQJMFFSSPSʹͳͬͯ͠·͍ͬͯͨ
w WY͔Β5VQMFUZQFར༻Մೳʹ declare function foo(a: number, b: number): void; const args1 = [1, 2] as [number, number]; foo(...args1); const args2 = [1, "bar" ] as [number, string]; // Argument of type 'string' is not assignable to // parameter of type 'number'. foo(...args2);
%FNP /* before */ import { hoge } from "./lib"; import { foo } from "./lib"; // no used import import { bar } from "./lib"; hoge(); foo(); /* after */ import { hoge, foo } from "./lib"; hoge(); foo();