TypeScriptの構文で「意味は分かるけど名前は分からん。そして単発記号or単語でググっても見つからん!」というのがあるのでメモとしてまとめます。
随時追加予定。
as
- type Assertion -
コンパイラに推論される型を明示的に上書きする。
interface Foo {
bar?: number;
bas?: string;
}
let foo = {} as Foo; // {} はFoo型だとコンパイラに伝えている
foo.bar = 123;
foo.bas = "hello";
in
- in operator
JSの in operator と使い方は同じ。オブジェクトのプロパティの判定に使える。
TypeScriptの場合はさらに、型の絞り込みとしても機能する。他にもMapped TypeのKeyの生成でも使われる。
TypeScript の"is"と"in"を理解する - Qiitaでも解説してます。
interface Bird {
fly();
layEggs();
}
interface Fish {
swim();
layEggs();
}
function move(pet: Fish | Bird) {
// petにswimプロパティがあるかどうか判定する。以降そのプロパティを持つ型として推論される。
if ("swim" in pet) {
// ここではFish型
return pet.swim();
}
// ここではBird型
return pet.fly();
}
is
- type predicates -
真偽値を返す関数の引数の型を絞り込めるようにする。
ユーザー定義型のType Guardとして使われることが多い。
TypeScript の"is"と"in"を理解する - Qiitaでも解説してます。
// この関数がtrueの場合、その空間でisFishの引数の変数は、Fish型として推論される
function isFish(pet: Fish | Bird): pet is Fish {
return (pet as Fish).swim !== undefined;
}
!
- non-null assertion operator -
コンパイラにこの値はnull,undefinedではなないと伝えるもの。
使いすぎ注意。丁寧に書くならtype guardで型を絞り込んだ方が良い。
function processEntity(e?: Entity) {
validateEntity(e);
let s = e!.name; // eはu`ndefined | Entity`ではなくEntityとして推論される
}
?.
- optional Chaining -
null, undefinedセーフな呼び出しを可能にする構文。便利。
let x = foo?.baz(); // fooがnull, undefの時はundef, それ以外の時はbaz()の戻り値
??
- nullish Coalescing -
値がnull, undefだった場合、??
の右辺の評価値を返す構文。
null, undefチェックの三項演算子のシンタックスシュガー。
let x = foo ?? bar(); // fooがnull, undefinedだったらbar()を実行, それ以外ならfooを返す