コンテンツにスキップ

TypeScript

はじめに

本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。


01. TypeScriptとは

静的型付けのフロントエンド言語である。

tsconfig.jsonファイルに基づいて、TypeScriptファイルをコンパイルし、JavaScriptファイルを作成する。

拡張子として、tstsx (TypeScript内にJSXを実装できる) を使用できる。


02. セットアップ

tsconfig.json

▼ exclude

{"exclude": ["<ファイル名>"]}


▼ include

{"include": ["<ファイル名>"]}


▼ compilerOptions

{
  "compilerOptions": {
  "lib": [ "DOM", "DOM.Iterable", "ES2019" ],
  "types": [ "vitest/globals" ],
  "isolatedModules": true,
  "esModuleInterop": true,
  "jsx": "react-jsx",
  "module": "CommonJS",
  "moduleResolution": "node",
  # any型を禁止にする
  "noImplicitAny": true,
  "resolveJsonModule": true,
  "target": "ES2019",
  "strict": true,
  "allowJs": true,
  "forceConsistentCasingInFileNames": true,
  "baseUrl": ".",
  "paths": {
    "~/*": [ "./app/*" ]
  },
  "skipLibCheck": true,
  "noEmit": true
}


03. 環境変数

出力

▼ 言語の実行環境

  • exportコマンドで出力する
  • コンテナの環境変数として出力する

▼ dotenvパッケージ

import dotenv from "dotenv";

// .envファイルを読み込む
dotenv.config();

// なんらかの実装


型の定義

interface Env {
  DATABASE_NAME: string;
  DATABASE_PORT?: number;
}

const myEnv: Env = {
  DATABASE_NAME: process.env.DATABASE_NAME || "",
  DATABASE_PORT: process.env.DATABASE_PORT
    ? parseInt(process.env.DATABASE_PORT)
    : undefined,
};


04. 型定義

プリミティブ

▼ 変数

let str: string = "hello";
// Type 'number' is not assignable to type 'string'.
str = 0;
let num: number = 0;
// Type 'string' is not assignable to type 'number'.
num = "0";
let big: bigint = 10n;
// Type 'number' is not assignable to type 'bigint'.
big = 0;
let bool: boolean = true;
// Type 'number' is not assignable to type 'boolean'.
bool = 1;
let n: null = null;
// Type 'undefined' is not assignable to type 'null'.
n = undefined;
let u: undefined = undefined;
// Type 'null' is not assignable to type 'undefined'.
u = null;
let sym: symbol = Symbol();
// Type 'string' is not assignable to type 'symbol'.
sym = "";


オブジェクト

▼ 変数

const object: {name: string; age: number} = {name: "taro", age: 20};

// Type 'number' is not assignable to type 'string'.
object.name = 20;

// Type 'string' is not assignable to type 'number'.
object.age = "taro";

// Property 'gender' does not exist on type '{ name: string; age: number; }'.
object.gender = "male";


配列

▼ 変数

const strArray: string[] = ["a", "b", "c"];

// Argument of type 'number' is not assignable to parameter of type 'string'.
strArray.push(0);
const numArray: number[] = [1, 2, 3];

// Argument of type 'string' is not assignable to parameter of type 'number'.
numArray.push("a");


ジェネリクス

▼ 変数

// string[] と同じ
const str: Array<string> = ["a", "b", "c"];
// (string|number)[] と同じ
const strOrNum: Array<string | number> = ["a", "b", 1, 2];
// string{} と同じ
const str: Map<string> = {a: "a", b: "b", c: "c"};

▼ 戻り値

// Promise<型>
async function asyncFn(): Promise<string> {
  // 非同期処理
  return "executed";
}

console.log(await asyncFn());

▼ 型変数

ここでは、引数と戻り値の型を変数として定義している。

変数に任意の型を代入すると、それに合わせた引数と戻り値の型の関数を定義できる。

const addKeys = <T, U>(key1: T, key2: U): Array<T | U> => {
  return [key1, key2];
};

addKeys<string, string>("a", "b");
addKeys<number, number>(1, 2);
addKeys<boolean, boolean>(true, false);
addKeys<string, number>("a", 1);


数値

▼ 引数

const sum = (x: number, y: number) => {
  return x + y;
};

console.log(sum(1, 2));
console.log(sum(1, "2")); // Argument of type 'string' is not assignable to parameter of type 'number'.
console.log(sum(1)); // Expected 2 arguments, but got 1.

▼ 戻り値

const sum = (x: number, y: number): number => {
  return x + y;
};


戻り値なし

// 戻り値がないという型
const logger = (): void => {
  console.log("log");
};


05. 型推論

暗黙的

let name = "John"; // 変数nameは文字列として推論されます
let age = 30; // 変数ageは数値として推論されます
let isProgrammer = true; // 変数isProgrammerはブール値として推論されます


明示的

let name: string = "John";
let age: number = 30;
let isProgrammer: boolean = true;