型の種類


型の指定

変数: 型

let 変数: string = "文字列"

変数: 型[]

配列の要素の型

let 変数: string[] = ["文字列", "文字列"]

function 関数(仮引数: 型): 戻り値の型 {}

変数: (仮引数: 型) => 戻り値の型

function 掛け算(x: number, y: number): number {
  return x * y
}
const かけざん: (x: number, y: number) => number = 掛け算
// アロー関数
const multiply = (x: number, y: number): number => x * y

JavaScriptと同様の型

number + string => string

let num: number = 2
let answer: string = `${num}の10乗は${num**10}`
console.log(answer) // 2の10乗は1024

JavaScriptにない型

組み合わせたもの


any

型検査をしたくないとき

プロパティにanyが伝播

let anyObj: any = 123
let anyObj2 = anyObj.x.y.z()
anyObj2.a.b.c() // anyが伝播、コンパイルOK

unknown

型が未知のとき

コンパイルエラー例

let 未知: unknown = 123
未知 + 0 // コンパイルエラー
未知 = {x:true}
未知.x // コンパイルエラー

未知 = 'a'
console.log(未知 + 'b') // ab
index.ts:2:1 - error TS2571: Object is of type 'unknown'.

typeofで型確定

let 未知: unknown = 123
if (typeof 未知 === 'number') {
  let 数 = 未知 + 1 // 型推論
  数 = 'abc' // コンパイルエラー
}
未知 + 1 // コンパイルエラー
index.ts:4:3 - error TS2322: Type 'string' is not assignable to type 'number'.

never

決してreturnしない関数

function 常にエラー(): never {
  throw new Error()
}
function 無限ループ(): never {
  while(true){}
}

void

undefinedreturnする関数

function ログ(): void {
  console.log("メッセージ")
}
const a = ログ()
console.log(a) // undefined

enum

識別子を列挙

enum 色 {
  赤, 緑 = 5, 青
}
console.log(色[0], 色[5], 色.青) // 赤 緑 6

function いろ(c: 色) {
  if (色.青 == c) console.log('あお')
}
いろ(色.青) // あお

オブジェクトの型

{プロパティ: 型, プロパティ?: 型}

function 累乗(obj: {x: number, n: number}): {answer: string} {
  return {answer: '答えは' + obj.x**obj.n}
}
console.log(累乗({x: 2, n: 10}))
// { answer: '答えは1024' }

再利用なら、interface

extendsで継承

interface 引数 {x: number, n: number; option?: string}
interface 戻り値 extends 引数{answer: string,}

function 累乗(obj: 引数): 戻り値 {
  const answer = '答えは' + obj.x**obj.n
  return {x: obj.x, n: obj.n, answer}
}
console.log(累乗({x: 2, n: 10}))
// { x: 2, n: 10, answer: '答えは1024' }

タプル

let config: [string, number, object]
config = ['alice', 23, {like: 'apple'}]

config[3] // コンパイルエラー
config = ['alice', 23] // コンパイルエラー
Tuple type '[string, number, object]' of length '3' has no element at index '3'.
Type '[string, number]' is not assignable to type '[string, number, object]'.