TypeScript入門 読書メモ
途中からメモしています。
3.6.4
オブジェクトの分割代入のデフォルト値は、undefinedに対してのみ適用される。
const obj = { foo: null }
const { foo = 123 } = obj
console.log(foo) // nullが表示される(123が代入されない)
以下の処理が走っていると考えるといい。
const foo = obj.foo !== undefined ? obj.foo : 123
TypeScriptの型チェックがあるのでめっちゃハマることはないだろうけど、ちょっとややこしい挙動。
3.7.4 弱参照のWeakMapについて
3.7.5 プリミティブなのにプロパティがある?
string型のようなプリミティブでも、{ length: number } や {} の部分型として成り立つ。(プロパティアクセスがあったときだけ、オブジェクトに変わるため。)
const str: { length: number } = 'hello' //エラーが出ない
そのため、null, undefined 以外 のプリミティブは基本的に {} の部分型として成り立つ。それを許容したくないときはunknownを使う。
共変(covariant)と反変(contravariant)
new Array() に数字の引数を一つだけ渡すとそのlengthを宣言するという挙動になりややこしいので、配列リテラルを使うほうが好ましい.
// 長さ10の配列
new Array(10)
// 10が格納された配列
const arr = [10]
処理の失敗を表す方法として、おもに「失敗を表す返り値を使う」または「例外を使う」の2種類あるが、一長一短である。後者のメリットは大域脱出が可能なこと、デメリットはエラーの型を取得できず、unknown型として扱わなければならない点である。
6.1.5
プロパティが「あるかもしれないし、ないかもしれない」という状況を表す記法は2つある。
type Human = {
name: string;
age?: number
}
// または
type Human = {
name: string;
age: number | undefined;
}
後者の場合は、ageプロパティの省略を許さない。
6.3.2
typeof nullは'object'を返答するので注意が必要。
console.log(typeof null)
// 'object'
6.4.4
keyof を 扱っているとき、number, symbolに関連するエラーがでたさいに関連する部分。
// 以下 K は 必ず string | symbol | number の部分型になる。
function get<T, K extends keyof T>(obj: T, key: K): T[K] {
// そのため、この代入はできない(string は string | symbol | number の部分型の部分型ではない)
const keyName: string = key
return obj[key]
}
// こうすれば代入できる (keyof T と string の インターセクションは string型)
function get<T, K extends keyof T & string>(obj: T, key: K): T[K] {
const keyName: string = key
return obj[key]
}
never型は、すべての型の部分型である。(never型に属する値は存在せず、たとえばnever型の変数には、すべての値を代入できない)
関数の戻り値をnever型にした場合は、エラーをthrowすることを表す。
function throwerror(): never {
throw new Error('error!!')
}
// コンパイルエラーはおきない
const result: never = throwerror()
// never は全ての型の部分型でありstringとしても振る舞えるため、この代入もコンパイルエラーは起きない。
const str: string = result
8.3.1
Promiseオブジェクトのほとんどは、作成された時点で非同期の処理が実行される。(.thenされた時点ではない。)
8.3.7
Promise.all, Promise.race に加えて、Promise.allSettled, Promise.anyが追加されている。