「TypeScriptとReact/Next.jsでつくる実践Webアプリケーション開発」の感想・備忘録2

スポンサーリンク
「TypeScriptとReact/Next.jsでつくる実践Webアプリケーション開発」の感想・備忘録1の続き

TypeScript

関数の型

以下のような記述は一見わかりづらいが、「引数が文字列で戻り値が文字列配列の関数」を引数に取る関数である。

const singBirds = (firstBird: (x: string) => string[]): string {
  return firstBird('カラス, 鳩')[0] + ' ピヨピヨ';
}

上記関数は以下のように呼び出す。

const splitBirdsCsv = (csv: string): string[] => {
  return csv.split(',');
}
console.log(singBirds(splitBirdsCsv));

型アサーション

Javaでいうダウンキャスト。

const canvas = document.getElementById('main_canvas')
console.log(canvas.width) // コンパイルエラー

TypeScriptはgetElementById()がHTMLElementを返すということしかわからない。
const canvas = document.getElementById('main_canvas') as HTMLCanvasElement
として、明示的に型を指定する必要がある。

複雑なアサーションを行いたい場合、まずanyに変換して2段階のアサーションとする必要がある。
const result = (response as any) as User

型エイリアス

オブジェクトの型エイリアス

type Point {
  x: number;
  y: number;
}
const zahyo: Point= {x: 100, y: 200}

※キー名を明記せずに定義することもできる(インデックス型)
キー名やキー数が事前に定まらない場合に便利。

type Point {
  [key: string]: number;
}
const zahyo: Point= {x: 100, y: 200, z: 200}}

関数の型エイリアス

可読性が上がる

type Formatter = (a: string) => string
const printName(name: string, formatter: Formatter){
  console.log(formatter(name)
}

import type

TypeScriptでは、import type { xxx } from './yyy'とすることで型のみをimportすることができる。
型のみをimportするため、変換されたJavaScriptからはこのコードは削除される。

typeとinterfaceの違い

オブジェクトの型を定義する場合は、ほぼ同等の機能を持つ。
TypeScriptの設計思想として、typeはオブジェクトの型そのものを定義するものであるが、interfaceはクラスやオブジェクトの一部のフィールドやメソッドを定義するものである。

interface Colorful {
  color: string;
}
interface Circle {
  radius: number;
}
interface ColorfulCircle extend Colorful,Circle {}

型定義ファイル

JavaScriptの外部ライブラリの型情報は以下のどちらかで用意する。

  1. @types/xxxとして公開されているnpmパッケージをインストールする
    (ライブラリに同梱されている場合もある)
    jQueryの場合、npm install --save-dev @types/jquery
  2. 型定義ファイル(拡張子.d.ts)を自作する

型定義ファイルを自作方法

以下のlib/hello.jsがある場合

exports.hello = function(name) {
  console.log(`Hello, ${name}`);
}

以下のlib/hello.d.tsを用意する。

export function hello(name: string): void

コメント