1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【TS】関数のオーバーロード

Last updated at Posted at 2024-12-17

見るからに戻り値がstring型でもstring|number型になってしまう

function toUpperFunc(x: string | number) {
  if (typeof x === "string") {
    return x.toLocaleUpperCase();
  }
  return x;
}

// const foo: string | number
const foo = toUpperFunc("foo");

関数をオーバーライドしてstring型で返す

function toUpperFunc(x: string): string;
function toUpperFunc(x: number): number;
function toUpperFunc(x: string | number) {
  if (typeof x === "string") {
    return x.toLocaleUpperCase();
  }
  return x;
}

// const foo: string
const foo = toUpperFunc("foo");

注意点① 一番下のstring|numberのシグネチャは必須

//エラー:このオーバーロード シグネチャには、実装シグネチャとの互換性はありません。
function toUpperFunc(x: string): string;
function toUpperFunc(x: number): number {
  if (typeof x === "string") {
    return x.toLocaleUpperCase();
  }
  return x;
}

注意点② ベースのシグネチャがとり得る型しかオーバーロードできない

// エラー:string|numberのどちらかのみ
function toUpperFunc(x: boolean): string;
function toUpperFunc(x: number): number {
function toUpperFunc(x: string | number) {
  if (typeof x === "string") {
    return x.toLocaleUpperCase();
  }
  return x;
}

注意点③ ベースのシグネチャがとり得る型であればありえない型を指定できる

function toUpperFunc(x: string): number;
function toUpperFunc(x: number): number;
function toUpperFunc(x: string | number) {
  if (typeof x === "string") {
    return x.toLocaleUpperCase();
  }
  return x;
}

// 大文字が返ってくるはずなのにnumber型で受け取る
// エラーにならない
// const foo: number
const foo = toUpperFunc("foo");

オーバーライドした関数を代入した変数の型

function toUpperFunc(x: string): string;
function toUpperFunc(x: number): number;
function toUpperFunc(x: string | number) {
  if (typeof x === "string") {
    return x.toLocaleUpperCase();
  }
  return x;
}

// fooの型はコールシグネチャで型定義される
// toUpperFunc: {
//    (x: string): string;
//    (x: number): number;
//}
const foo = toUpperFunc;
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?