UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

【TypeScript】TypeScript 4.7の新機能の気になったやつだけ

Typescript4.7の新機能をいくつかみてみた

devblogs.microsoft.com

ECMAScript Module Support in Node.js

TypscriptにおけるNode.jsのECMAScript Moduleをサポート

これにより

  • .mts/.ctsという拡張子が増えた
  • ESM / CJS ごとに型定義を読み分けられるようになった
  • moduleDetectionオプションの追加

など

quramy.medium.com

extends Constraints on infer Type Variables

https://devblogs.microsoft.com/typescript/announcing-typescript-4-7-beta/#extends-constraints-on-infer-type-variables

type FirstString<T> =
    T extends [infer S, ...unknown[]]
        ? S extends string ? S : never
        : never;

infer型に制約を設定できるようになった

type FirstString<T> =
    T extends [infer S extends string, ...unknown[]]
        ? S
        : never;

Instantiation Expressions

以下のような関数(道具箱をつくる)があったとき

interface Box<T> {
    value: T;
}

function makeBox<T>(value: T) {
    return { value };
}

より専門的な道具箱(ハンマーとレンチ)を作る場合、この関数をラップする必要がある

function makeHammerBox(hammer: Hammer) {
    return makeBox(hammer);
}

// or...

const makeWrenchBox: (wrench: Wrench) => Box<Wrench> = makeBox;

ただ、これをわざわざつくるのは手間なので、4.7では以下のようにジェネリクスで戻り値の型を定義できるようになった

const makeHammerBox = makeBox<Hammer>;
const makeWrenchBox = makeBox<Wrench>;

Optional Variance Annotations for Type Parameters

outinアノテーションをつけることで、Tが入力と出力のどちらの型で使われるのかを明示することができるうようになった

interface Animal {
    animalStuff: any;
}

interface Dog extends Animal {
    dogStuff: any;
}

// ...

type Getter<out T> = () => T;

type Setter<in T> = (value: T) => void;

参考

TypeScript 4.7と型レベルプログラミング - Speaker Deck