ããã«ã¡ã¯ãæ°åã® id:w1p ãšç³ããŸãã ä»åæ¥åã§TypeScriptãå°å
¥ãããšããããšã§ãããæ©äŒãªã®ã§TypeScriptã«ã€ããŠãããã調ã¹ãŸããã ç®æ¬¡ ç°å¢æ§ç¯ TypeScriptã®åºæ¬çãªææ³ åã¢ãããŒã·ã§ã³ã®æžãæ¹ åºæ¬ã®å numberå bigintå stringå booleanå symbolå nullå undefinedå åãšã€ãªã¢ã¹ã§åã«å¥åãã€ãã ãªãã©ã«å è€åå objectå arrayå tupleå enum æ°å€åenumã®æ³šæç¹ class Unionå Intersectionå ãã®ä»ã®å Functionå Index Signitures ç¹æ®ãªå any unknown void never ã€ã³ã¿ãŒãã§ãŒã¹ãšåãšã€ãªã¢ã¹ ã€ã³ã¿ãŒãã§ãŒã¹ 2ã€ã®éã 宣èšã®ããŒãž ããªããã£ãåãšUnionå ãã®ä» ãžã§ããªã¯ã¹ ãžã§ããªã¯ã¹ãå°å
¥ã§ããå Žæ 颿°å åãšã€ãªã¢ã¹ ã€ã³ã¿ãŒãã§ãŒã¹ tsconfig.json åãæäœãã åã®ããŒã¯ãŒã typeof keyof Lookup Types in extends infer Utility Types Partial / Required / Readonly Pick<T, K> Record<K, T> Exclude<T, ExcludedUnion> Union Distribution Extract<T, Union> Omit<Type, Keys> NonNullable Parameters ConstructorParameters ReturnType InstanceType ThisParameterType OmitThisParameter ThisType Uppercase / Lowercase Capitalize / Uncapitalize ãŸãšã åè ç°å¢æ§ç¯ Microsoft å
¬åŒããã©ãŠã¶äžã§å®è¡ã§ãã ãµã³ãããã¯ã¹ ãæäŸããŠãããããã䜿çšãããšæè»œã«TypeScriptã詊ãããšãã§ããŸãã TypeScriptãã JavaScript ãžã®å€æçµæããåå®çŸ©ãã¡ã€ã«çæã®çµæãŸã§èŠããŸãã ãã®èšäºã§åºãŠãããµã³ãã«ã³ãŒãã¯ãã¹ãŠTS Playground v4.1.2äžã§è¡ã£ãŠããŸãã Playground Link Visual Studio Code ã Intellij IDEAãªã©æå
ã®ãšãã£ã¿ã§æžããŠããŒã«ã«ã§å®è¡ãããå Žåã«ã¯ä»¥äžã®æé ãèžãå¿
èŠããããŸãã npm or yarnãã€ã³ã¹ããŒã«ãããŠããããšãåæã§ãã Step1. TypeScriptãã€ã³ã¹ããŒã«ãã $ mkdir ts && cd ts $ npm init -y # yarn init -y $ npm i -D typescript # yarn add -D typescript Step2. .tsæ¡åŒµåã®ãã¡ã€ã«ãäœæãã $ echo ' console.log("Hello, TypeScript!"); ' > ./hello.ts Step3. TypeScriptãå®è¡ãã ããã§ã¯æè»œã«TypeScriptãå®è¡ããæ¹æ³ãšããŠã tsc ã䜿çšããæ¹æ³ãšã ts-node ãšããããã±ãŒãžã䜿çšããæ¹æ³ã玹ä»ããŸãã tsc ã䜿çšããå Žå tsc ã¯TypeScriptã JavaScript ãžãã©ã³ã¹ãã€ã«ããããã®å
¬åŒããŒã«ã§ãã tsc ã®æå㯠tsc å®è¡æã«ãªãã·ã§ã³ãšããŠæž¡ãããã tsconfig.json ãšãããã¡ã€ã«ã§å€æŽããããšãã§ããŸãã hello.ts ã®ãããã©ã«ãã§ä»¥äžãå®è¡ããŸãã $ npx tsc ./hello.ts # yarn run tsc ./hello.ts tsc ã¯ãã©ã³ã¹ãã€ã«ããçµæãæå®ããã ãã£ã¬ã¯ã ãªã«åºåããŸãã ä»åã¯ç¹ã«æå®ããŠããŸããã®ã§ã«ã¬ã³ã ãã£ã¬ã¯ã ãªã«åºåãããŸãã ããšã¯éåžžã®jsãã¡ã€ã«ãšåæ§ã«å®è¡ã§ããŸãã $ node hello.js Hello, TypeScript! ts-nodeã䜿çšããå Žå ts-node ã䜿çšãããšã tsc â node ãšãã2床æéãçç¥ã§ããŸãã $ npm i -D ts-node # yarn add -D ts-node å®è¡ã¯ä»¥äžã®ããã«è¡ããŸãã $ npx ts-node ./hello.ts # yarn run ts-node ./hello.ts TypeScriptã®åºæ¬çãªææ³ ãããŸã§ã¯ã©ã®ããã«TypeScriptãã¡ã€ã«ãå®è¡ããã®ãã«ã€ããŠèŠãŠããŸããã ããããã¯åºæ¬çãªTypescriptã®ææ³ã«ã€ããŠèŠãŠãããŸãã å ã¢ãããŒã·ã§ã³ ã®æžãæ¹ å ã¢ãããŒã·ã§ã³ ãšã¯ã倿°ã颿°ã®æ»ãå€ãªã©ã®åãäœã§ããããæç€ºçã«æå®ããããšã§ãã åºæ¬çã«ã¯ : type ã®åœ¢åŒã§æžãããšãã§ããŸãã // 倿°nã®åãnumberã« let n: number = 123 n = 'string' // Type 'string' is not assignable to type 'number'. // argãstring, fã®æ»ãå€ã¯voidã« function f ( arg: string ) : void { /* */ } f ( 123 ) // Argument of type 'number' is not assignable to parameter of type 'string'. TypeScriptã¯ åæšè« (åãã³ã³ãã¯ã¹ãããæšè«ããããš)ã«ãããå
šãŠã®å Žæã«å ã¢ãããŒã·ã§ã³ ãå¿
èŠãšããªãä»çµã¿ã«ãªã£ãŠããŸãã // nã¯numberåãšæšè«ããã let n = 123 // tã¯booleanåãšæšè«ããã let t = true ; åºæ¬ã®å æ©éã§ãããTypeScriptã®æ žãšãªãåã«ã€ããŠã¿ãŠãããŸãã ããã§ç޹ä»ããåã¯ããªããã£ãåãšåŒã°ããåºæ¬çãªåã§ãã numberå numberåã¯å®æ°ã«å ããç¡éã衚ã Infinity , éæ°ã衚ã NaN ãå«ãŸããŸãã const n1: number = 123 ; const n2: number = -0 . 1 ; const n3: number = Infinity ; const n4: number = NaN ; bigintå ES2020ã§å°å
¥ãããbigintå㯠Number.MAX_SAFE_INTEGER(2^53 - 1) ããã倧ããªæŽæ°ãæ±ãããšãã§ããŸãã 粟床ãèœã¡ãå¯èœæ§ãããããnumberå倿°ãžçŽæ¥ä»£å
¥ããããšã¯ã§ãããæç€ºçãªå€æãå¿
èŠã«ãªããŸãã let big = 123n ; let num = 123 ; num = big ; // Type 'bigint' is not assignable to type 'number'. big = num ; // Type 'number' is not assignable to type 'bigint'. num = Number ( big ); big = BigInt ( num ); stringå æååå
šè¬ããšãããåã§ãã const s1: string = "Hello, World!" ; const s2: string = s1.slice ( 0 , 5 ); booleanå true ãš false ã®2ã€ã®å€ããšãåŸãåã§ãã let b: boolean ; b = true ; b = false ; b = !!1 ; b = 1 ; // Type 'number' is not assignable to type 'boolean'. symbolå ES2015ããåãå
¥ãããããäžæã®å€ãçæããããã®ä»çµã¿ã§ãã const s1: unique symbol = Symbol ( 'abc' ); // typeof s1 let s2 = Symbol ( 'abc' ); // symbol let s3 = Symbol . for( 'abc' ); // symbol const s4 = Symbol . for( 'abc' ) // symbol console .log ( s1 === s2 ); // false console .log ( s2 === s3 ); // false console .log ( s3 === s4 ); // true nullå nullãããã¯anyåã®ã¿ãåãä»ããåã§ãã const n1: null = null ; const n2: null = 123 as any ; const n3: null = undefined ; // Type 'undefined' is not assignable to type 'null'. const n4: null = 123 as unknown ; // Type 'unknown' is not assignable to type 'null'. undefinedå undefinedãšanyåã®ã¿ãåãä»ããŸãã const u1: undefined = undefined ; const u2: undefined = 123 as any ; const u3: undefined = null ; // Type 'null' is not assignable to type 'undefined'. const u4: undefined = 123 as unknown ; // // Type 'unknown' is not assignable to type 'null'. å ãšã€ãªã¢ã¹ ã§åã«å¥åãã€ãã å ãšã€ãªã¢ã¹ ãšåŒã°ããæ©èœã«ãããä»»æã®åã«å¥åãã€ããããšãã§ããŸãã å ãšã€ãªã¢ã¹ 㯠type ããŒã¯ãŒãã§äœæã§ããŸãã type ID = number ; type Name = string ; type Cond = boolean ; ãªãã©ã« å TypeScriptã®é¢çœãç¹åŸŽãšã㊠ãªãã©ã« åããããŸãã ãªãã©ã« åãšã¯ãããªããã£ãåã«å«ãŸããäžéšã®å€ã®ã¿ããšããããããªåã§ãã const ã§å€æ°ãå®çŸ©ããéã«ãTypeScriptã¯ãã®å€ã¯ããå€åããªãã ãããšèã ãªãã©ã« åã§æšè«ããŸãã // numberã®ãªãã©ã«å let num1 = 123 ; // numberå const num2 = 123 ; // 123å // stringã®ãªãã©ã«å let str1 = "abc" ; // stringå const str2 = "abc" ; // "abc"å // booleanã®ãªãã©ã«å let bool1 = true ; // booleanå const bool2 = false ; // falseå åŸè¿°ããUnionåãšããçµã¿åãããŠäœ¿ãããŸãã // 蚱容ããHTTPã¡ãœããã®äžèЧ type AllowedHttpMethods = "GET" | "HEAD" | "POST" | "PUT" ; let method: AllowedHttpMethods = "GET" ; // OK method = "PUT" ; // OK method = "DELETE" ; // Type '"DELETE"' is not assignable to type 'AllowedHttpMethods'. è€åå objectå ããªããã£ãå以å€ã®å€ããšãããåã§ãã ãªããžã§ã¯ãã®æ§é ãæå®ããããšã¯ã§ããŸããã const o1: object = { a: 123 , b: "abc" } ; const o2: object = {} const o3: object = 123 ; // Type 'number' is not assignable to type 'object'. const o4: object = null ; // Type 'null' is not assignable to type 'object'. arrayå é
åã衚ãåã§ãã å ã¢ãããŒã·ã§ã³ ã®æ¹æ³ãšã㊠T[] ãš Array<T> ã®2ãã¿ãŒã³ãããŸãããåè
ã®æ¹ãå€ã䜿ãããŠããŸãã const arr1: number [] = [ 1 , 2 , 3 ] ; const arr2: Array < string > = [ "a" , "b" , "c" ] ; tupleå TypeScriptã§ã¯ã¿ãã«åã宣èšã§ããŸãã ã¿ãã«ã¯è€æ°ã®èŠçŽ ãããªãçµã¿åããã®ãããªåã§ãã é
åãšéãã®ã¯ãç°ãªãåã®èŠçŽ ãå
±åã§ããç¹ã§ãã const tup1: [ number , string ] = [ 1 , "str" ] ; const tup2: [ number , number , number ] = [ 1 , 2 , 3 ] ; const arr: number [] = tup2 ; // numberåã®èŠçŽ ãããªãããé
åã«å²ãåœãŠå¯èœ enum tupleåæ§ãTypeScriptã¯ç¬èªã« enum ã䜿çšã§ããŸãã enum 㯠ããã°ã©ã ãäºåã«å®çŸ©ããç¹å®ã®å€ã®ã¿ããšããããããªåã§ãã enum Suits { Diamonds , Clubs , Hearts , Spades } console .log ( Suits.Diamonds === 0 ) // true ããããã®åæåã«ã¯å€ãå²ãåœãŠãããšãã§ããŸãã äžã® Suits ã«ã¯å€ãå²ãåœãŠãŠããŸãããããã®ãããªå ŽåTypeScriptã¯0ããæ°å€ãå²ãåœãŠãŸãã æ°å€å enum ã®æ³šæç¹ ãTypeScriptã® Enum ã¯äœ¿ããªãæ¹ãè¯ãããšããæèŠãèããããšãããæ¹ãããã£ãããããšæããŸããã 1çªã®åé¡ãšããŠã¯æ°å€åã® enum ã«ã¯ãã¹ãŠã®æ°å€ãå²ãåœãŠãããšãã§ããŠããŸãç¹ããšæããŸãã const suit: Suits = 10000 ; // OK ãããåé¿ããããã«ã¯æåååã® enum ã䜿çšãããããããã¯Unionåã䜿çšããæ¹æ³ããããŸãã enum Suits { Diamonds = "Diamonds" , Clubs = "Clubs" , Hearts = "Hearts" , Spades = "Spades" } const suit: Suits = Suits.Diamonds ; type Suits = "Diamonds" | "Clubs" | "Hearts" | "Spades" ; const suit: Suits = "Diamonds" ; class ES2015ããå°å
¥ãããclass宣èšã¯ãã¡ããTypeScriptã§ãå©çšã§ããŸãã class Animal { // TypeScriptã§ã¯private / protected / publicã䜿çšã§ãã private species?: string ; constructor( species: string ) { this .species = species ; } } const animal = new Animal ( 'dog' ); animal.species = 'cat' ; // Property 'species' is private and only accessible within class 'Animal'. speciesãã£ãŒã«ãã¯privateãªãããã¯ã©ã¹å€éšããè§Šãããšã¯ã§ãããšã©ãŒã«ãªã£ãŠããŸãã Unionå TypeScriptã®å€§ããªç¹åŸŽãšããŠããæããããã®ããã®Unionåã§ããåå士ã | ã§ã€ãªãããšã§äœæã§ããŸãã Unionã®ååéããUnionåã¯æ§æããåããšãå€ããããã®åéåã«ãªããŸãã type StrOrNum = string | number ; let val: StrOrNum = "str" ; val = 123 ; val = true ; // Type 'boolean' is not assignable to type 'string | number'. ãã®äŸã® StrOrNum ã¯stringããšãããå€ãšnumberåããšãããå€ã®äž¡æ¹ããšããŸãã Intersectionå Intersectionåã¯ããããã®åãããã«ãå²ãåœãŠãããåãäœãåºããŸãã Unionåãåéåãšã¿ããªããIntersectionåã¯ç©éåãäœãåºãã€ã¡ãŒãžã§ãã type StrOrNum = string | number ; type BoolOrNum = boolean | number ; type I = StrOrNum & BoolOrNum ; let val: I = 123 ; // valã¯numberåã«ãªã val = 'str' ; // Type 'string' is not assignable to type 'number'. val = true ; // Type 'boolean' is not assignable to type 'number'. ãã®ä»ã®å Functionå Functionåã¯å
šãŠã®é¢æ°ãåãä»ããåã§ãã åŒæ°ã®åãæ°ãæ»ãå€ã®åãªã©ã¯æå®ã§ããªããããobjectåãšåãã䜿çšé »åºŠã¯é«ããããŸããã let fun: Function = ( arg: string ) => console .log ( `Hello, ${ arg } !!` ); fun ( 'TypeScript' ); // "Hello, TypeScript!!" fun () // "Hello, undefined!!" let fun2: ( arg: string ) => void = ( arg: string ) => console .log ( `Hello, ${ arg } !!` ); fun2 (); // Expected 1 arguments, but got 0. fun 㯠arg ãšããåŒæ°ãå¿
èŠã§ããã Function åã§å®£èšããŠããããã«TypeScriptã¯èŠåãåºããŸããã åºæ¬çã«ã¯äžã®äŸã§äœ¿çšãã (arg: type) => returnType ãšãã圢åŒã§ ã¢ãããŒã·ã§ã³ ããŸãã Index Signitures ããŒã®åãå€ã®åãæå®ããŠããããã£ã®åæ°ã¯æå®ããªããããªãªããžã§ã¯ããå®çŸ©ã§ããŸãã type T = { [ key: number ] : string } const t: T = { 1 : 'one' , 2 : 'two' , 3 : 'three' } ; // ãã®ã³ãŒãã¯ãšã©ãŒã«ãªããªãã®ã§æ³šæ console .log ( t [ 0 ] .length ); // Cannot read property 'length' of undefined ç¹æ®ãªå any anyã¯äœã§ãããã®åã§ããã©ã®ãããªåã§ãåãä»ããã©ã®ãããªåã«ãå²ãåœãŠãããŸãã let any : any ; any = 123 ; any = { a: 123 , b: 'string' } ; any = null ; any = 123 as unknown ; const s: undefined = any ; anyåã¯å®éã®å€ãã©ã®ãããªåãå
šãããããªããããTypeScriptã®ã¡ãªããã享åãã¥ãããªã£ãŠããŸããŸãã ãããžã§ã¯ãã JavaScript ããTypeScriptã«çœ®ãæããéã«ããšããããanyãšããŠåãã€ããŠããã®ã¯äŸ¿å©ã§ããã ã§ãããªã䜿çšã¯é¿ããã¹ãã§ãã åãå®è¡æãŸã§ããããªããããªå Žåã«ã¯ãunknownåã®äœ¿çšããŸãã¯æ€èšããŸãããã unknown TypeScript 3.0ããå°å
¥ãããŸããã unknownåã®å€æ°ã¯ã©ã®ãããªå€ã代å
¥å¯èœãªç¹ã§anyãšåæ§ã§ããã倿°ãå©çšãããšãã«ã¯ ãã®å€æ°ã®å€ã®åãå®éã¯äœã§ãããã倿ãããŸã§å©çšããããšãã§ããŸããã let unknown : unknown ; unknown = 123 ; unknown = { a: 123 , b: 'string' } ; // æ¯èŒã¯å¯èœ if ( !! unknown ) { console .log ( 'truthy' ); } unknown = 'Hello unknown' ; if (typeof unknown === 'string' ) { console .log ( unknown .substring ( 0 , 5 )); } äžã®äŸã§ã¯ typeof æŒç®å ã䜿çšãã倿° unknown ã®å®éã®åãäœã§ãããããã§ãã¯ããŠãã String.substring ã¡ãœããã䜿çšããŠããŸãã åããã§ãã¯ããªããã°å€æ°ã䜿çšã§ããªããšããé¢ã§ any åã®å€æ°ãããå®å
šã§ãã void returnæã§å€ãè¿ããªã颿°ã®æ»ãå€ã¯voidåãšããŠæšè«ãããŸãã function f () {} type R = typeof f ; // () => void // undefinedã¯voidåã«ä»£å
¥å¯èœ let r = f (); r = undefined ; never neveråã¯ãšãããå€ãäžã€ããªãåã§ãã neveråã®å€æ°ã«ã¯anyãã代å
¥ã§ããŸããã let never : never ; never = {} ; // Type '{}' is not assignable to type 'never'. never = 123 as any ; // Type 'any' is not assignable to type 'never'. ãšãããå€ãäžã€ããªããããneveråãšãã®ä»ã®åã®Unionåã«ãããŠneveråã¯ç¡èŠãããŸãã type T = string | number | never ; // T㯠string | number å 䜿ãæãšããŠã¯ãå®è¡ããã2床ãšåŒã³åºãå
ã®é¢æ°ã«åŠçãæ»ããªããããªé¢æ°ã®æ»ãå€ããããŸãã 以äžã¯Nodeã® Process.exit 颿°ã®åã§ãã NodeJS.Process.exit ( code?: number | undefined ) : never exitãåŒã³åºããæç¹ã§æå®ããã ã¹ããŒã¿ã¹ã³ãŒã ã§ããã»ã¹ãçµäºãããããåŒã³åºãå
ã«åŠçãæ»ãããšã¯ãããŸããã ãã®ä»ãåŸè¿°ããConditional Typesã«ãããŠã䜿çšãããŠããŸãã ã€ã³ã¿ãŒãã§ãŒã¹ãšå ãšã€ãªã¢ã¹ ã€ã³ã¿ãŒãã§ãŒã¹ TypeScriptã«ã¯ã€ã³ã¿ãŒãã§ãŒã¹ãšããä»çµã¿ãããããªããžã§ã¯ãã®æ§é ãæå®ããããšãã§ããŸãã interface User { name: string , id: number , registeredDate: Date } const user: User = { name: 'Guest' , id: 0 , registeredDate: new Date ( '1900-01-01' ) } Classã«å®è£
ããããšãã§ããŸãã class UserClass implements User { constructor( public name: string , public id: number , public registeredDate: Date ) { } } å ãšã€ãªã¢ã¹ ãããã¯ä»ã®ã€ã³ã¿ãŒãã§ãŒã¹ãç¶æ¿ã§ããŸãã type Animal = { name: string , age: number } interface Cat extends Animal { mew () : void } const tama: Cat = { name: 'tama' , age: 2 , mew () { console .log ( "mew" ) } } 2ã€ã®éã TypeScriptã«ã¯å ãšã€ãªã¢ã¹ ãšã€ã³ã¿ãŒãã§ãŒã¹ãååšããå
±ã«ãªããžã§ã¯ãã®æ§é ãå®çŸ©ããããšãã§ããŸãã ãã®2ã€ã¯äœãéãã®ã§ããããïŒ å®£èšã®ããŒãž ã€ã³ã¿ãŒãã§ãŒã¹ã¯ååã®ã€ã³ã¿ãŒãã§ãŒã¹ãéè€ããŠå®£èšã§ããŸãã ãã®å Žåã¯ã€ã³ã¿ãŒãã§ãŒã¹ã®å®çŸ©ãTypeScriptãèªåçã«ããŒãžããŸãã interface User { id: number } interface User { // åäžã®ããããã£ã¯åãåã§ãªããã°ãªããªã // id: string, name: string , } const user: User = { id: 0 , name: "Guest" } ; å€éšã©ã€ãã©ãªã®åãæ¡åŒµãããå Žåã€ã³ã¿ãŒãã§ãŒã¹ã§å®£èšãããŠããã°ã ååã®ã€ã³ã¿ãŒãã§ãŒã¹ãå床宣èšããã ãã§æ¡åŒµãå¯èœã§ãã 察ããŠãååã®å ãšã€ãªã¢ã¹ ã¯ãšã©ãŒã«ãªããŸãã // Duplicate identifier 'User'. type User = { id: number } type User = { name: string } ããªããã£ãåãšUnionå ã€ã³ã¿ãŒãã§ãŒã¹ã§ã¯å ãšã€ãªã¢ã¹ ã§è¡šçŸã§ãã以äžã®ãããªåã衚çŸã§ããŸããã // ããªããã£ãå type ID = number ; // Unionå type NumOrStr = number | string ; ãã®ä» ã€ã³ããã¯ã¹ ã·ã°ãã㣠ãåã®ããããã£ãšããŠæã€éã«éããããããã§ãã assignabiltity between interfaces and types · Issue #14736 · microsoft/TypeScript · GitHub ãžã§ããªã¯ã¹ ãžã§ããªã¯ã¹ ã¯TypeScriptã«éããæ§ã
ãªèšèªã§å°å
¥ãããŠãããåãæœè±¡åããããã®ä»çµã¿ã§ãã é
åã®ããããã®èŠçŽ ã«é¢æ°ãé©çšãã map 颿°ã¯ ãžã§ããªã¯ã¹ ã䜿çšããŠä»¥äžã®ããã«å®çŸ©ã§ããŸãã // <T>ã«ãã£ãŠå倿°Tãå°å
¥ã§ãã function map < T >( arr: T [] , f: ( element: T ) => T ) : T [] { const result = [] ; for ( const e of arr ) { result.push ( f ( e )) } return result ; } console .log ( map ( [ 1 , 2 , 3 ] , elm => elm * 2 )) ãžã§ããªã¯ã¹ ãå°å
¥ã§ããå Žæ 颿°å äžã®mapåã®ãããªæžãæ¹ãå¯èœã§ãããã¢ããŒé¢æ°ã§ããã¡ãã ãžã§ããªã¯ã¹ ã䜿çšã§ããŸãã const map = < T >( arr: T [] , f: ( e: T ) => T ) : T [] => { /* ... */ } å ãšã€ãªã¢ã¹ type F < T , R > = ( arg: T ) => R ; const f: F < number , string > = arg => arg.toString (); ã€ã³ã¿ãŒãã§ãŒã¹ interface F < T , R > { ( arg: T ) : R ; } const f: F < number , string > = arg => arg.toString (); tsconfig. json tsconfig.json ã¯TypeScript ã³ã³ãã€ã© ã®æåãæå®ããããã®èšå®ãã¡ã€ã«ã§ãã 以äžã®ã³ãã³ããå®è¡ãããšã«ã¬ã³ã ãã£ã¬ã¯ã ãªäžã«ããã©ã«ãã® tsconfig.json ãäœæãããŸãã $ tsc -- init tsconfigã§èšå®å¯èœãªãªãã·ã§ã³ã®äžèЧã¯ä»¥äžã§ç¢ºèªã§ããŸãã TypeScript: TSConfig Reference - Docs on every TSConfig option åãæäœãã åã®ããŒã¯ãŒã ããã§ã¯TypeScriptã®åã«ãŸã€ããããŒã¯ãŒãã«ã€ããŠç޹ä»ããŸãã typeof typeof val ã§valã®å€ã®åãååŸã§ããŸãã const n = 123 ; const s = 'str' ; const o = { n , s } ; const u = undefined ; // T1 = 123 type T1 = typeof n ; // T2 = "str" type T2 = typeof s ; // T3 = {s: string, n: number} type T3 = typeof o ; // T4 = undefined type T4 = typeof u ; keyof keyof 㯠keyof Type ãšããããšã§ã Type ãæã€ããããã£ãUnionåãšããŠåŸãããšãã§ãã æŒç®å ã§ãã type User = { id: number ; name: string ; age: number ; } // type UserKey = "id" | "name" | "age" type UserKey = keyof User ; Lookup Types Lookup Typesã¯ç¹å¥ãªããŒã¯ãŒããããããã§ã¯ãããŸãããã keyof ãšçµã¿åãããŠäœ¿ãããããšã å€ãããããã§ç޹ä»ããŸãã ããåTã®ããããã£Kã®åã T[K] ãšããŠåç
§ã§ããæ©èœã§ãã type User = { id: number ; name: string ; age: number ; } // type UserIdType = number type UserIdType = User [ 'id' ] ; in for..in æ§æã§ã䜿çšãããinã§ãããTypeScriptã§ã¯ Mapped Types ãšåŒã°ããæ§æã®ããã®ããŒã¯ãŒããšããŠãçšããããŸãã // type U = {A: any, B: any, C: any} type U = { [ K in "A" | "B" | "C" ] : any } inã®åŸãã«ããèŠçŽ (Unionåã®å Žåã«ã¯1ã€ãã€åãåºãã€ã¡ãŒãž)ãããŒãšããããããã£ãäœæããŸãã extends classãinterface,typeãªã©ãç¶æ¿ããéã«çšãããã extends ããŒã¯ãŒãã§ããã Conditional Types ãšåŒã°ããæ©èœã§ã䜿çšãããŠããŸãã // T1 = true type T1 = number extends number | string ? true : false ; // T2 = false type T2 = number extends null ? true : false ; T extends U ? X : Y ãšãªã£ãŠããç®æã Conditional Types ã§ããTypeScript 2.8ããå°å
¥ãããŸããã TãUã«å²ãåœãŠå¯èœã§ããã°Xãå²ãåœãŠäžå¯ã§ããã°Yãè¿ããŸãã äžã®äŸã§ã¯ number å㯠number | string åã«ãã¡ããå²ãåœãŠãããŸãã®ã§ãT1㯠true åã«ãªããŸãã ããã null åã«ã¯å²ãåœãŠãããŸããã®ã§ãT2㯠false åã«ãªããŸãã infer inferã¯æšè«ããåãå倿°ãšããŠäœ¿çšããããã®ä»çµã¿ã§ããConditional Typeså
ã§äœ¿çšã§ããŸãã äŸãšããŠãã®åŸç޹ä»ããUtility Typesãã ReturnType ãšããåãèŠãŠã¿ãŸãã type ReturnType < T extends ( ...args: any ) => any > = T extends ( ...args: any ) => infer R ? R : any ; ãžã§ããªã¯ã¹ T extends (...args: any) => any ã®éšåã¯Tã«å²ãåœãŠãããåã颿°åã«å¶éããŠããŸãã å³èŸºã® T extends (...args: any) => infer R ã¯Tã颿°åãã©ãããextendsã§å€å®ãããšãšãã«ã 颿°ã®æ»ãå€ã®åã R ãšããæ°ããªå倿°ã«ãã€ã³ãããŠããŸãã åœç¶Tã颿°åã§ãªãå Žåã«ã¯Rã«å€ããã€ã³ããããªãã®ã§ãRã䜿çšã§ããã®ã¯Tã颿°åã®å Žåã®ã¿ã§ãã ãã®ä»ã®å Žåã«ã¯anyåã«ãªããŸãã Utility Types æåŸã«TypeScriptçµã¿èŸŒã¿ã®ãããã€ãã®äŸ¿å©ãªåã«ã€ããŠç޹ä»ããŸãã äžã®keyofãextendsãªã©ã®äœ¿çšäŸãçãæ²¢å±±ã§ãã Partial / Required / Readonly ãã®3ã€ã¯äŒŒããããªå®çŸ©ãªã®ã§ãŸãšããŠç޹ä»ããŸãã type Partial < T > = { [ P in keyof T ] ?: T [ P ] ; } ; type Required < T > = { [ P in keyof T ] -?: T [ P ] ; } ; type Readonly < T > = { readonly [ P in keyof T ] : T [ P ] ; } ; Partialã¯ãªããžã§ã¯ãã®ããããã£ãçç¥å¯èœ( key?: value ã®æ§æ)ã«ããŸãã Mapped Type ãçšã㊠T ã®ããããã£ãåæããŠãããããã£ã« ? ãã€ããããšã§å
šãŠã®ããããã£ãçç¥å¯èœã«ããŠããŸãã T[P] ã®ç®æã¯ Lookup Types ã§ãåããããã£ã®å€ã®åãåç
§ããŠããŸãã Requiredã¯å
šãŠã®ããããã£ãçç¥äžå¯ã«ãReadonlyã¯å€æŽäžå¯ã«ããåã§ãã è£è¶³: readonlyã«ã€ã㊠readonly ã¯ããããã£ã倿Žäžå¯ã«ããããŒã¯ãŒãã§ãã type U = { a: string , b: number } type T = Readonly < U > const t: T = { a: "str" , b: 123 , } t.a = "modified" ; // Attempt to assign to const or readonly variable readonly ã ? ãšåæ§ã« -readonly ãšããããšã§ãåããããã£ãã readonly ãåãé€ãããšãã§ããŸãã Pick<T, K> Pickã¯ãªããžã§ã¯ãã®åããæå®ããããããã£ã®ã¿ãæã€ãªããžã§ã¯ããäœãåã§ãã type Pick < T , K extends keyof T > = { [ P in K ] : T [ P ] ; } // T = { a: string, b: number } type T = Pick < { a: string , b: number , c: boolean } , "a" | "b" > K extends keyof T ã®éšåã¯ãKãæå®ã§ããããããã£ãTãæã€ããããã£ã®ã¿ã«å¶éããŠããŸãã Record<K, T> Recordã¯2ã€ã®åK, TãåãåããKã®åããããã£ã«å¯ŸããŠTãå€ãšãããªããžã§ã¯ãã®åãäœãåã§ãã type Record < K extends keyof any , T > = { [ P in K ] : T ; } ; keyof any ã¯ç¢ºèªããŠã¿ããšããããŸããã string | number | symbol ãšããUnionåã§ãã type K = string | number | symbol ã€ãŸã K extends keyof any ã¯ããŒãšããåTããããŒãšããŠæå®ã§ããåã«å¶çŽããŠãããšããããšã«ãªããŸãã Exclude<T, ExcludedUnion> Excludeã¯åTããExcludedUnionã®åèŠçŽ ãé€ãããã®ãäœãåã§ãã type Exclude < T , U > = T extends U ? never : T ; // type E = 123 | "str" type E = Exclude < 123 | "str" | (() => any ), Function > 123 | "str" | (() => any) ãšããUnionåãããFunctionåã«å²ãåœãŠå¯èœãªåã®ã¿ãåãé€ããŠããŸãã never åãè¿åŽããçç±ã¯ãå
ã®æ¹ã§ãè¿°ã¹ãŸãããã以äžã®ããã«Unionåã«ããã never ã¯ãªããã®ãšããŠæ±ããããã§ãã // U1 = string | number type U1 = string | number | never ; // U2 = void type U2 = null | void | never ; Union Distribution äžã®äŸã®ããã«ã T extends U ã®T ãå倿°ãã€Unionåã®å ŽåãTypeScript㯠Union Distribution ãšããç¹æ®ãªæåã«ãªããŸãã type Exclude < T , U > = T extends U ? never : T ; // type E = 123 | "str" type E1 = Exclude < 123 | "str" | (() => any ), Function > // E1ã¯ãããªæãã«åé
ãããã€ã¡ãŒãž type E2 = 123 extends Function ? never : 123 | "str" extends Function ? never : "str" | (() => any ) extends Function ? never : (() => any ); åè: TypeScript: Documentation - Advanced Types#Distributive conditional types Extract<T, Union> Excludeã®éã§ãã type Extract < T , Union > = T extends Union ? T : never ; Omit<Type, Keys> TypeScript 3.5ããå°å
¥ãããŸããã Pickãšã¯å¯Ÿç
§çã«ãããããã£ãKeysãšããŠUnionåã§æå®ãTypeããåãé€ããŸãã type Omit < T , K extends keyof any > = Pick < T , Exclude <keyof T , K >>; // T = { c: boolean } type T = Omit < { a: string , b: number , c: boolean } , "a" | "b" > æ¢åºã®Utility Typesã§ããPickãšExcludeã䜿çšããŠããŸãã Excludeã§Tã®ããããã£ããKãé€ããæ®ã£ãããããã£ã®ã¿ã®åãPickã§äœæããŠããŸãã NonNullable åTãåãåããååéãnullã¯ãã¡ãããundefinedãTããåãé€ããŸãã type NonNullable < T > = T extends null | undefined ? never : T ; // U = string | (() => any) type U = NonNullable < string | null | undefined | (() => any )> Parameters 颿°åãåãåããåŒæ°ã®åãã¿ãã«åãšããŠè¿åŽããŸãã type Parameters < T extends ( ...args: any ) => any > = T extends ( ...args: infer Arg ) => any ? Arg : never ; // P1 = [a: number, b: string] type P1 = Parameters <( a: number , b: string ) => void > // P2 = type P2 = [a: { b: number, c: boolean }] type P2 = Parameters <( a: { b: number , c: boolean } ) => string > // P3 = unknown[] type P3 = Parameters < any > infer ã䜿çšããŠåŒæ°ã®åãæšè«ããçµæãArgãšããæ°ããªå倿°ã«ãã€ã³ãããŠããŸãã ConstructorParameters Parameterã®ã³ã³ã¹ã ã©ã¯ ã¿çã§ãã type ConstructorParameters < T extends new ( ...args: any ) => any > = T extends new ( ...args: infer Arg ) => any ? Arg : never ; class A { constructor( private id: number , private name: string , ) {} } // U = [id: number, name: string] type U = ConstructorParameters <typeof A > T extends new (...args: any) => any ã§Tã®åãããåãã³ã³ã¹ã ã©ã¯ ã¿ã«å¶éããŠããŸãã ReturnType Parametersã®æ»ãå€çã§ãã type ReturnType < T extends ( ...args: any ) => any > = T extends ( ...args: any ) => infer R ? R : any ; // U1 = void type U1 = ReturnType <() => void > function f () { return Math .random () < 0.5 ? "OK" : "NG" } // U2 = "OK" | "NG" type U2 = ReturnType <typeof f > infer ã§ä»åºŠã¯æ»ãå€ã®åãæšè«ããŠããŸãã InstanceType constructorã®æ»ãå€ã®åãååŸããŸãã ReturnTypeã®ã³ã³ã¹ã ã©ã¯ ã¿çã§ãã type InstanceType < T extends new ( ...args: any ) => any > = T extends new ( ...args: any ) => infer Class ? Class : any ; class C { constructor( private name: string = "Guest" , private id: number = 0 ) {} } // U1 = C type U1 = InstanceType <typeof C > // U2 = any type U2 = InstanceType < any > ThisParameterType Tã颿°åã§ this ããã©ã¡ãŒã¿ãšããŠæã€å Žåã«ãã®åãè¿åŽããŸãã type ThisParameterType < T > = T extends ( this : infer This , ...args: any ) => any ? This : unknown ; function f1 ( this : number ) {} function f2 ( arg: number ) {} // F1 = number type F1 = ThisParameterType <typeof f1 > // F2 = unknown type F2 = ThisParameterType <typeof f2 > this ãã©ã¡ãŒã¿ã¯å¿
ãåŒæ°ã®å
é ã§ããå¿
èŠãããããããããå©çšããŠthisã®åãæšè«ããŠããŸãã OmitThisParameter 颿°åTãåãåããTã this ãã©ã¡ãŒã¿ãå«ãã§ããã°ãããé€ãã颿°åãè¿ããŸãã type OmitThisParameter < T > = unknown extends ThisParameterType < T > ? T : T extends ( ...args: infer A ) => infer R ? ( ...args: A ) => R : T ; // F1 = (a: string) => any type F1 = OmitThisParameter <( this : number , a: string ) => any > // F2 = 123 type F2 = OmitThisParameter < 123 > unknown extends ThisParameterType<T> ã§Tãthisãã©ã¡ãŒã¿ãå«ããã©ãã確èªããŠããŸãã thisã¯å¯å€é·åŒæ°ã®ãã©ã¡ãŒã¿ã«å«ãŸããªããããªã®ã§ã颿°åã§ããã°å¯å€é·åŒæ°ã®åãæšè«ããŠè¿ããŸãã ThisType ãã®åãå©çšããããã«ã¯ --noImplicitThis ãæå¹ã«ããå¿
èŠããããŸãã å
¬åŒã®äŸãåŒçšããŠèª¬æããŸãã TypeScript: Documentation - Utility Types#ThisType type ObjectDescriptor < D , M > = { data?: D ; methods?: M & ThisType < D & M >; // Type of 'this' in methods is D & M } ; function makeObject < D , M >( desc: ObjectDescriptor < D , M >) : D & M { let data: object = desc.data || {} ; let methods: object = desc.methods || {} ; return { ...data , ...methods } as D & M ; } let obj = makeObject ( { data: { x: 0 , y: 0 } , methods: { moveBy ( dx: number , dy: number ) { this .x += dx ; // Strongly typed this this .y += dy ; // Strongly typed this } , } , } ); obj.x = 10 ; obj.y = 20 ; obj.moveBy ( 5 , 5 ); ObjectDescriptor å
ã® methods?: M & ThisType<D & M> ã¯ãmethodså
ã§äœ¿çšããã this ã®åãobjã®åã§ãã D & M åã« ã¢ãããŒã·ã§ã³ ããŸãã D & M åã¯dataã®åãšmethodsã®åã®äº€å·®åãªã®ã§ãä»åã¯ä»¥äžã®ãããªåã«ãªããŸãã { x: number ; y: number ; moveBy ( dx: number , dy: number ) : void ; } makeObjectã®åŒæ°ã ObjectDescriptor åãªã®ã§ãmethodå
ã® this ãäžã®ãããªåã«æšè«ããããã this.x ã®åœ¢åŒã§xã«ã¢ã¯ã»ã¹ã§ããããšããããšã ãšæãããŸãã ã¡ãªã¿ã«ThisTypeã§ ã¢ãããŒã·ã§ã³ ããªãå Žåã«ã¯é¢æ°å
ã®thisã¯ä»¥äžã®åã«ãªããŸãã®ã§ãTypeScriptã¯ãšã©ãŒãåºããŸãã moveBy ( dx: number , dy: number ) { // Property 'x' does not exist on type '{ moveBy(dx: number, dy: number): void; }' this .x += dx ; // Property 'y' does not exist on type '{ moveBy(dx: number, dy: number): void; }' this .y += dy ; } Uppercase / Lowercase ãããã玹ä»ãã4ã€ã®åã¯TypeScript 4.1ããå°å
¥ãããæ°ããã®åã§ãããã£ããã§ãã®ã§ç޹ä»ããŸãã ããããæåååãæäœã§ããŸãã // U1 = "FOO" type U1 = Uppercase < "foo" >; // U2 = "bar" type U2 = Lowercase < "BAR" > Capitalize / Uncapitalize // C1 = "Foo" type C1 = Capitalize < "foo" >; // C2 = "bar" type C2 = Uncapitalize < "Bar" > ãããã¯åäœã§äœ¿ããšãããããã¯ãåãã4.1ããå°å
¥ãããä»çµã¿ã§ãã Template literal types ã®è£å©ãšããŠäœ¿ãããã®ã§ã¯ãšæããŸãã Template literal types ã®èª¬æã¯æµç³ã«å
¥éèšäºã®ç¯å²å€ã®ãã岿ããŸãã詳ããç¥ãããæ¹ã¯ãã¡ããã芧ãã ããã TypeScript: Documentation - Template Literal Types ãŸãšã å
¥éèšäºãšããããšã§é·ãã«ãªã£ãŠããŸããŸããããããããã£ããã«å°ãã§ãTypeScriptã«èå³ãæã£ãŠããã ãããªãå¬ããéãã§ãã 玹ä»ããŠããªãTypeScriptã®æ©èœããŸã ãŸã ããããã§ãã®ã§ããŸãæ©äŒãããã°æžãããŠããã ããããšæããŸãã åè O'Reilly Japan - ããã°ã©ãã³ã°TypeScript å®è·µTypeScript | ãã€ããããã¯ã¹ TypeScript: Handbook - The TypeScript Handbook TypeScript: TSConfig Reference - Docs on every TSConfig option TypeScript: Documentation - Utility Types TypeScript Ninja TypeScriptã®åå
¥é - Qiita TypeScriptã®ååçŽ - Qiita ããããªããTypeScript enum | Kabuku Developers Blog TypeScriptã®enumã䜿ããªãã»ããããçç±ããTree-shakingã®èгç¹ã§ç޹ä»ããŸã - LINE ENGINEERING TypeScriptã®InterfaceãšTypeã®æ¯èŒ - Qiita TypeScriptã«ã€ããæ©èœãå
¥ããããªã®ã§ã²ãšãããéãã§ã¿ãïœTechRachoïŒããã¯ã©ããã§ïŒããšã³ãžãã¢ã®ãïŒãããïŒãã«ãïœBPSæ ªåŒäŒç€Ÿ TypeScript: Interfaces vs Types - Stack Overflow assignabiltity between interfaces and types · Issue #14736 · microsoft/TypeScript · GitHub ãšã³ãžã㢠äžéæ¡çš ãµã€ã ã©ã¯ ã¹ã§ã¯ããšã³ãžãã¢ã»ãã¶ã€ããŒã® äžéæ¡çš ãç©æ¥µçã«è¡ã£ãŠãããŸãïŒ ãèå³ãããŸãããæ¯éã確èªããé¡ãããŸãã https://career-recruit.rakus.co.jp/career_engineer/ ã«ãžã¥ã¢ã«é¢è«ãç³èŸŒã¿ãã©ãŒã ã©ã®è·çš®ã«å¿åããã°è¯ããããããªããšããæ¹ã¯ãã«ãžã¥ã¢ã«é¢è«ãéæè¡ã£ãŠãããŸãã 以äžãã©ãŒã ãããç³èŸŒã¿ãã ããã forms.gle ã€ãã³ãæ
å ± äŒç€Ÿã®é°å²æ°ãç¥ãããæ¹ã¯ãæ¯é±éå¬ããŠããã€ãã³ãã«ãåå ãã ããïŒ rakus.connpass.com