プロジェクトでの型プログラミングの重要性は言うまでもありません。この記事では、TypeScriptの一般的な機能をまとめ、TypeScriptの使用を熟練させるのに役立ちます。
アドバンスト・タイプ
交差型
交差型は、& 記号を使用して複数の型を1つの型に結合します。
interface I1 {
name: string;
}
interface I2 {
age: number;
}
type T3 = I1 & I2
const a: T3 = {
name: "tj",
age: 11,
}
ユニオン型
ユニオン型は、| 記号を使用して値がいくつかの型のうちのどれかであることを表します。
const a: string | number = 1
文字列リテラル型
文字列リテラル型は、文字列型を変数の型として使用します。
const a: 'number' = 'number'
数値リテラル型
数値リテラル型は、数字を変数の型として使用します。
const a: 1 = 1
ブールリテラル型
ブールリテラル型は、真偽値を変数の型として使用します。
const a: true = true
文字列テンプレート型
文字列テンプレート型は、ES6のテンプレート文字列構文を使用して型を制約します。
type https = `https://${string}`
const a: https = `https://jd.com`
演算子
keyof
keyofは、特定の型のすべてのキーを取得するために使用され、その戻り値はユニオン型です。
// const a: 'name' | 'age' = 'name'
const a: keyof {
name: string,
age: number
} = 'name'
typeof
typeofは、オブジェクトまたは関数の構造型を取得するために使用されます。
const a2 = {
name: 'tj',
}
type T1 = typeof a2 // {name: string}
function fn1(x: number): number {
return x * 10
}
type T2 = typeof fn1 // (x: number) => number
in
inは、ユニオン型を繰り返し処理するために使用されます。
const obj = {
name: "tj",
age: 11,
}
type T5 = {
[P in keyof typeof obj]: any
}
/*
{
name: any,
age: any
}
*/
T[K]
T[K]は、インデックスにアクセスし、そのインデックスに対応する値のユニオン型を取得するために使用されます。
interface I3 {
name: string,
age: number
}
type T6 = I3[keyof I3] // string | number
演算子
非nullアサーション演算子
非nullアサーション演算子 ! は、要素がnullまたはundefinedでないことを強調し、プロパティは明示的に値が割り当てられることをTypeScriptに伝えます。
function Demo(): JSX.Element () {
const divRef = useRef<HTMLDivElement>()
useEffect(() => {
divRef.current!.scrollIntoView() // divRef.currentがnullまたはundefinedでないことをアサーション
}, [])
return <div ref={divRef}>divDemo</div>
}
オプショナルチェイン演算子
オプショナルチェイン演算子 ?. は、左側の式の値がnullまたはundefinedかどうかを判断し、そうであれば式の実行を停止します。
const a = b?.a
nullish合併演算子
nullish合併演算子 ?? は、左側の式の値がnullまたはundefinedかどうかを判断し、そうでない場合は右側の値を返します。
const a = b ?? 10
数値セパレータ
数値セパレータ _ は、長い数字を区切り、数字を読みやすくするために使用されます。コンパイル結果では _ は自動的に削除されます。
const num: number = 1_111_111_111
型エイリアス
型エイリアスは、型に新しい名前を付けるために使用されます。
type Message = string | string[]
let greet = (message: Message) => {
// ...
}
型アサーション
型アサーションは、ブラウザに対して型を明示的に指定することを意味します。
// 尖括弧構文
let someValue: any = "this is a string";
let strLength: number = (<string>someValue).length;
// as
構文
let someValue: any = "this is a string";
let strLength: number = (someValue as string).length;
型ガード
型ガードは、実行時に特定のスコープ内の型を確認するためのいくつかの式です。
interface A {
name: string;
age: number;
}
interface B {
sex: string;
home: string;
}
function doSomething(person: A | B): void {
if (person.name) {
// エラー
// ...
}
}
// `in`型ガードを使用する
function doSomething(person: A | B): void {
if ("name" in person) {
// OK
// ...
}
}
// `typeof`型ガードを使用する
function A(a: string | number): string | number {
if (typeof a === "string") {
// OK
return a + ""
}
if (typeof a === "number") {
// OK
return a + 2
}
return ""
}
// `instanceof`型ガード
class Foo {
}
class Bar {
}
function test(input: Foo | Bar) {
if (input instanceof Foo) {
// ここで `input` の型が「狭まる」
} else {
// ここで `input` の型が「狭まる」
}
}