TypeScript 4.7 Beta
12766 ワード
TypeScript 4.7 Beta
TypeScript 4.7 Betaが出ました。
今回は気になった新機能について紹介します。
infer
がより便利に
infer
で推論する型に対して制約(extends
)が付けられるようになりました。
これにより、今まで制約が付けられなかったためにネストが深くなっていたコードがより浅い記述で書けます。
before
inferWithoutExtends.ts
type Sum<List extends number[], Result extends number = 0> = List extends [infer Head, ...infer Tail]
? Head extends number
? Tail extends number[]
? Sum<Tail, Plus<Head, Result>>
: never
: never
: Result
after
inferWithExtends.ts
type SumWithExtends<List extends number[], Result extends number = 0> =
List extends [infer Head extends number, ...infer Tail extends number[]]
? SumWithExtends<Tail, Plus<Head, Result>>
: Result
ネストが減ることで不要なnever
も減るのでわかりやすいコードになったように思います。
スマートキャストがより強力に
以前までは型の絞り込みが正しくなされていなかったのが、今回からはできるようになったそうです。
before
unsmartCast.ts
const key = Symbol();
const numberOrString = Math.random() < 0.5 ? 42 : "hello";
let obj = {
[key]: numberOrString,
};
if (typeof obj[key] === "string") {
+ // Property 'toUpperCase' does not exist on type 'string | number'.
+ // Property 'toUpperCase' does not exist on type 'number'
let str = obj[key].toUpperCase();
}
after
smartCast.ts
if (typeof obj[key] === "string") {
- // Property 'toUpperCase' does not exist on type 'string | number'.
- // Property 'toUpperCase' does not exist on type 'number'
let str = obj[key].toUpperCase();
}
以前だとこれを解消するために一時的に定数を作って、その型をチェックして利用することが必要でしたね。
beforeImprovingSmartCast.ts
const stringOrNumber = obj[key]
if (typeof stringOrNumber === "string") {
let str = stringOrNumber.toUpperCase();
}
型引数のみの適用が可能に
以前までは関数に対する型引数のみの適用ができなかったのですが、それができるようになりました。
before
applingGenerics.ts
interface Box<T> {
value: T;
}
function makeBox<T>(value: T) {
return { value };
}
type Hammer = any
type Wrench = never
+ // 'Hammer' only refers to a type, but is being used as a value here.
const makeHammerBox = makeBox<Hammer>
const makeWrenchBox = makeBox<Wrench>
after
applingGenerics.ts
interface Box<T> {
value: T;
}
function makeBox<T>(value: T) {
return { value };
}
type Hammer = any
type Wrench = never
const makeHammerBox = makeBox<Hammer> // ok
const makeWrenchBox = makeBox<Wrench> // ok
Author And Source
この問題について(TypeScript 4.7 Beta ), 我々は、より多くの情報をここで見つけました https://zenn.dev/shebangdog/articles/2ed6d023210aea著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Collection and Share based on the CC protocol