TypeScript¶
はじめに¶
本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。
01. TypeScriptとは¶
静的型付けのフロントエンド言語である。
tsconfig.json
ファイルに基づいて、TypeScriptファイルをコンパイルし、JavaScriptファイルを作成する。
拡張子として、ts
とtsx
(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;