Open13

TypeScript入門 読書メモ

fujitenfujiten

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の型チェックがあるのでめっちゃハマることはないだろうけど、ちょっとややこしい挙動。

fujitenfujiten

3.7.5 プリミティブなのにプロパティがある?

string型のようなプリミティブでも、{ length: number } や {} の部分型として成り立つ。(プロパティアクセスがあったときだけ、オブジェクトに変わるため。)

const str: { length: number } = 'hello'  //エラーが出ない

そのため、null, undefined 以外 のプリミティブは基本的に {} の部分型として成り立つ。それを許容したくないときはunknownを使う。

fujitenfujiten

new Array() に数字の引数を一つだけ渡すとそのlengthを宣言するという挙動になりややこしいので、配列リテラルを使うほうが好ましい.

// 長さ10の配列
new Array(10)

// 10が格納された配列
const arr = [10]
fujitenfujiten

処理の失敗を表す方法として、おもに「失敗を表す返り値を使う」または「例外を使う」の2種類あるが、一長一短である。後者のメリットは大域脱出が可能なこと、デメリットはエラーの型を取得できず、unknown型として扱わなければならない点である。

fujitenfujiten

6.1.5
プロパティが「あるかもしれないし、ないかもしれない」という状況を表す記法は2つある。

type Human = {
  name: string;
  age?: number
}

// または

type Human = {
  name: string;
  age: number | undefined;
}

後者の場合は、ageプロパティの省略を許さない。

fujitenfujiten

6.3.2
typeof nullは'object'を返答するので注意が必要。

console.log(typeof null)
// 'object'
fujitenfujiten

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]
}

fujitenfujiten

never型は、すべての型の部分型である。(never型に属する値は存在せず、たとえばnever型の変数には、すべての値を代入できない)

関数の戻り値をnever型にした場合は、エラーをthrowすることを表す。

function throwerror(): never {
  throw new Error('error!!')
}

// コンパイルエラーはおきない
const result: never = throwerror()

// never は全ての型の部分型でありstringとしても振る舞えるため、この代入もコンパイルエラーは起きない。
const str: string = result
fujitenfujiten

8.3.1

Promiseオブジェクトのほとんどは、作成された時点で非同期の処理が実行される。(.thenされた時点ではない。)

fujitenfujiten

8.3.7

Promise.all, Promise.race に加えて、Promise.allSettled, Promise.anyが追加されている。