GWあと残り4日・・。あっという間です。
今日はTypeScriptやるです。
https://oukayuka.booth.pm/items/1312652
引き続き、この素敵すぎる本。
TypeScript
インストール
npm i -g typescript ts-node
ts-node って何?
- nodeコマンドでjsファイルを実行すると同じように、ts-nodeでtsファイルを実行できるようにする
- これないとトランスパイルする作業が必要・・らしい?(って他のサイトでみた)
トランスパイル
- トランスコンパイル
- ある言語からある言語へコンパイルする
- 高水準→低水準ではなく、同じ程度の水準コードに変換する
書籍通りに、ターミナルから REPL使って実行したみたんだけど、エラーが出て動かず。。なぜ?
vscodeのターミナル上でやってみたら、うまく動いたです。なんでだろう。。
型
- number
- string
- boolean
- symbol
- null
- undefined
配列
const ary1: number[] = [1,2,3]; console.log(ary1); const ary2: Array<number>=[1,2,3] console.log(ary2); // どっちも同じ(ary1の書き方を使うこと)
$ ts-node test5.ts [ 1, 2, 3 ] [ 1, 2, 3 ]
オブジェクト
const hanako: { name:string,age:number } = { name:'hanako',age:19 };
interface User {
name: string;
age?:number; // ?を付けると省略OK
}
const sakura: User = { name:'sakura', age:20 };
const karen: User = { name:'karen'};
// typeはインターフェースに別の名前を付ける
// 型同士の合成で使う
type Person = User;
const taro: Person = { name:'Taro', age:25 };
const jiro: Person = { name:'jiro' }
console.log(hanako);
console.log(sakura);
console.log(karen);
console.log(taro);
console.log(jiro);
$ ts-node test6.ts
{ name: 'hanako', age: 19 }
{ name: 'sakura', age: 20 }
{ name: 'karen' }
{ name: 'Taro', age: 25 }
{ name: 'jiro' }
型の合成
interface Foo { hoge?: number, fuga: string };
interface Bar { hoge: number };
interface Buz { piyo: string };
type FooBar1 = Foo & Bar;
const test1: FooBar1 = { fuga:'test1', hoge: 10 }
const test2: FooBar1 = { hoge:20, fuga:'test2' }
type FooBar2 = Foo | Bar;
const test3: FooBar2 = { hoge:100, fuga: 'test3' }
const test4: FooBar2 = { hoge: 200 }
type BarFooBuz = Bar &(Foo | Buz);
const test5: BarFooBuz = { fuga:'test5', hoge:300 }
console.log(test1);
console.log(test2);
console.log(test3);
console.log(test4);
console.log(test5);
$ ts-node test7.ts
{ fuga: 'test1', hoge: 10 }
{ hoge: 20, fuga: 'test2' }
{ hoge: 100, fuga: 'test3' }
{ hoge: 200 }
{ fuga: 'test5', hoge: 300 }
合成タイプ
- 交差型(Intersection Type)
- 共用型(Union Type)
constだけど、要素には代入できちゃう
const ary=[1,2,3]
console.log(ary);
ary[1]=10;
console.log(ary);
const obj={ a:1, b:2 }
console.log(obj);
obj.b=1000;
console.log(obj);
$ ts-node test8.ts
[ 1, 2, 3 ]
[ 1, 10, 3 ]
{ a: 1, b: 2 }
{ a: 1, b: 1000 }
ReadOnly型(TypeScript3.4から)
ReadOnly型はリリースされたばかりだから安定しているかは?
ちゃんとチェックしてくれる!
ReadOnly使わないなら、インデックスを指定して値を上書きしないように気をつける。
→書き換えるのではなく、新しいオブジェクトにコピーすると良い。
const colorObj = { red: 'ff0000', green:'00ff' };
console.log(colorObj);
const newColorObj = { ...colorObj, green: '00ee00', bule:'0000ff'};
console.log(newColorObj);
$ ts-node test10.ts
{ red: 'ff0000', green: '00ff' }
{ red: 'ff0000', green: '00ee00', bule: '0000ff' }
関数
- 引数は型指定必要
- 戻り値は型推論される
const add = (n:number, m:number): number => n + m;
console.log(add(1,3));
function subtr(n:number, m:number): number { return n-m; };
console.log(subtr(10,3));
const gree = (): void => { console.log('hi!') };
gree();
$ ts-node test11.ts 4 7 hi!
const add = (n:number, m:number): number => n + m;
function subtr(n:number, m:number): number { return n-m; };
const gree = (): void => { console.log('hi!') };
引数の型指定、戻り値の型指定
ReturnType
- 戻り値の型を予め設定しておく?
- 型を複数関数の戻り値のを共用体型として作りたい場合とか
- Reduxでよく使う
const gree2 = () => 'おは'; type Gree2 = ReturnType<typeof gree2>; const gree3 = (): Gree2 => 'おはよ'; console.log(gree2()); console.log(gree3());
$ ts-node test12.ts おは おはよ
tsconfig.json
- コンパイルの設定を行うファイル
- Create React Appで生成される
- 実行ディレクトリにないと親ディレクトリに遡って探しに行く
- 絶対パスインポート(import { MyComponent } from './componemt/MyComponent';)がサポートされていない
モジュール
npm i --save-dev typescript @types/express
yarn info @types/react-router
この @ マークの書き方って何?
- TypeScript用に型定義されたJavaScriptパッケージを探す時に使う
- DefinitlyTypedプロジェクトが提供している(非公式)
- yarn info @types/パッケージ名 って感じで使う


