見出し画像

【ワンピースで覚えるTypeScript】第12回 関数の型(JavaScript学習者向け)

今回はTypeScriptの関数の型について説明します。

アロー関数式の記法に似ています。

部分型との関係も含めて理解していきましょう!

type S = (material: string) => string;

const createDevilFruits: S = (str: string): string => str.repeat(2)+ "の実";

console.log(createDevilFruits("ゴム"));
//引数名によって、ドキュメント化を支援
console.log(createDevilFruits("ヒト"));

//コールシグネチャ
type AbilityPerson = {
  age?: number;
  (str: string): void;
}
//string型を受け取る関数
const luffy: AbilityPerson = (str: string) => {
  console.log(`${str}の能力者`);
}

luffy.age = 19;
console.log(luffy.age);

luffy("ゴムゴムの実");

//部分型(返り値)
type Character = {
  name: string;
}

type WantedCharacter = {
  name: string;
  bounty: number;
}
//WantedCharacterはCharacterの部分型

//(bounty: number) => WantedCharacter は
//(bounty: number) => Character の部分型

//オブジェクトを返す関数chopper         //返り値
const chopper = (bounty: number): WantedCharacter => ({
  name: "チョッパー",
  bounty,
});

console.log(chopper);
console.log(chopper(1000));

//「(bounty: number) => Character型」の変数characterに
//「(bounty: number) => WantedCharacter型」のchopperを代入
const character: (bounty: number) => Character = chopper;

console.log(character(1000));

//部分型(引数)
type Character1 = {
  name: string;
}

type WantedCharacter1 = {
  name: string;
  bounty: number;
}
//WantedCharacter1はCharacter1の部分型
const getName = (obj: Character1) => {
  console.log(obj.name);
}
//(obj: WantedCharacter1) => void は
//(obj: Character1) => void の部分型

const character1: (obj: WantedCharacter1) => void = getName;
character1({
  name: "チョッパー", bounty: 1000
});
//bountyプロパティを持っているが、本来はCharacter1型なので影響はない

//部分型(引数の数の違い)
type One = (bounty: number) => number;
type Two = (bounty1: number, bounty2: number) => number;

const doubleBounty: One = bounty => bounty * 2;
const addBounty: Two = (bounty1, bounty2) => bounty1 + bounty2;

const calcuBounty: Two = doubleBounty;
console.log(calcuBounty(1000, 50));
//Two型を使用しているので、2つの引数を渡している
//しかし、代入されているのはOne型の関数
  //=> 引数は1つしか受け取らない

この記事が気に入ったらサポートをしてみませんか?