🐈

個人的TypeScriipt 5.5 まとめ

2024/06/22に公開

TypeScript 5.5がアナウンスされました。
https://devblogs.microsoft.com/typescript/announcing-typescript-5-5/

個人的にマイナーの割にビックニュースが多かったのでまとめました

Type Predicatesの推論

5.5からはガード関数の戻り値が type predicates として推論されるようになりました

// function isBirdReal(bird: Bird | undefined): bird is Bird
function isBirdReal(bird: Bird | undefined) {
  return bird !== undefined;
}

これによってfilterのようなメソッドで type predicates を明示的に書かなくても配列の型が推論によって絞られるようになりました

Before

const birds: (Bird | undefined)[] = [...]
birds.filter(bird => bird !== undefined) // (Bird | undefined)[]
birds.filter((bird): bird is Bird => bird !== undefined); // Bird[]

After

const birds: (Bird | undefined)[] = [...]
birds.filter(bird => bird !== undefined) // Bird[]

オブジェクトのインデックスアクセスのガードが推論可能に

function f1(obj: Record<string, unknown>, key: string) {
    if (typeof obj[key] === "string") {
        // Now okay, previously was error
        obj[key].toUpperCase();
    }
}

Setクラスのメソッドが追加される

ESの proposal-set-methods で提案されているunionやintersectionのようなメソッドをサポート

具体的には以下

  • union
  • intersection
  • difference
  • symmetricDifference
  • isSubsetOf
  • isSupersetOf
  • isDisjointFrom

Isolated Declarations

背景が壮大すぎるので以下参照
https://zenn.dev/cybozu_frontend/articles/ts-explicit-type-annotation

undefinedを型の命名に使えなくなる

意図せずバグで export type undefined = が宣言できてしまっていた模様

export type undefined = ''

この宣言が組み込みの undefined を上書きすることはないが。namespaceや import * as ns from "..." などとした時は宣言した型になる模様

これがちゃんと宣言したタイミングでエラーになるように治りました。

Discussion