第1問 解説
実装当初から一貫してこの挙動で、理由はPR内で
説明されている。
The issue is that you practically never want the literal type. After all,
why write a function that promises to always return the same value?
https://github.com/microsoft/TypeScript/pull/10676#issuecomment-244257359
(要約)常に特定の値を返す関数なんて書かんでしょ
Slide 10
Slide 10 text
第1問 解説
返り値が1つでもリテラル型のほうがいい場合は
as constを使う。
// “hello”
function getHello() {
return "hello" as const;
}
Slide 11
Slide 11 text
第1問 解説
ちなみに、ユニオン型の場合も
let変数に入れるとstringに
なってしまう。
(この辺りの細かい挙動はwidening
で調べてみよう)
function getHelloOrWorld() {
if (Math.random() < 0.5) {
return "hello";
} else {
return "world";
}
}
let str = getHelloOrWorld();
// ^? let str: string
第4問
type Not = B extends true ? false : true;
type IsString = T extends string ? true : false;
type IsNotString = Not>;
type Output = IsNotString;
このコードで、Output型は1~4のうちどれになる?
1: never 2: false
3: true 4: boolean
Slide 32
Slide 32 text
第4問
type Not = B extends true ? false : true;
type IsString = T extends string ? true : false;
type IsNotString = Not>;
type Output = IsNotString;
このコードで、Output型は1~4のうちどれになる?
1: never 2: false
3: true 4: boolean
正解は……
Slide 33
Slide 33 text
第4問
type Not = B extends true ? false : true;
type IsString = T extends string ? true : false;
type IsNotString = Not>;
type Output = IsNotString;
このコードで、Output型は1~4のうちどれになる?
4: boolean
Slide 34
Slide 34 text
第4問 解説
type Not = B extends true ? false : true;
type IsString = T extends string ? true : false;
type IsNotString = Not>;
type Output = IsNotString;
条件型 (conditional types) の分配 (distribution) 知ってますか?
という知識問題でした。
IsString
= (string extends string ? true : false) | (number extends string ? true : false)
= true | false
= boolean
型の計算の流れ①
Slide 35
Slide 35 text
第4問 解説
type Not = B extends true ? false : true;
type IsString = T extends string ? true : false;
type IsNotString = Not>;
type Output = IsNotString;
条件型 (conditional types) の分配 (distribution) 知ってますか?
という知識問題でした。
IsNotString
= Not> = Not
= (true extends true ? false : true) | (false extends true ? false : true)
= false | true = boolean
型の計算の流れ②
Slide 36
Slide 36 text
予備
Slide 37
Slide 37 text
第5問
type Not = B extends true ? false : true;
type IsString = T extends string ? true : false;
type IsNotString = Not>;
type Output = IsNotString;
// ^? Output = boolean
第4問のこのコードを、Output が true になるように修正します。
分配が起こらないように直せば修正できます。
Slide 38
Slide 38 text
第5問
type Not = B[] extends true[] ? false : true;
type IsString = T[] extends string[] ? true : false;
type IsNotString = Not>;
type Output = IsNotString;
// ^? Output = true
実は、このように直せば分配が起こらなくなり、修正できます。
Slide 39
Slide 39 text
第5問
type Not = B[] extends true[] ? false : true;
type IsString = T[] extends string[] ? true : false;
type IsNotString = Not>>>;
type Output = IsNotString;
// ^? Output = false
しかし、調子に乗ってNotを3重にしたら壊れました。
Notの定義を変えることで、Outputがtrueとなる
正しい挙動に修正してください。
Slide 40
Slide 40 text
第5問
type Not = B[] extends true[] ? false : true;
修正前
type Not = readonly B[] extends readonly true[] ? false : true;
1
type Not = [B] extends [true] ? false : true;
2
type Not = {v:B} extends {v:true} ? false : true;
3
type Not = (()=>B) extends (()=>true) ? false : true;
4
Slide 41
Slide 41 text
第5問
type Not = B[] extends true[] ? false : true;
修正前
type Not = readonly B[] extends readonly true[] ? false : true;
1
type Not = [B] extends [true] ? false : true;
2
type Not = {v:B} extends {v:true} ? false : true;
3
type Not = (()=>B) extends (()=>true) ? false : true;
4
正解は……
Slide 42
Slide 42 text
第5問
type Not = B[] extends true[] ? false : true;
修正前
type Not = [B] extends [true] ? false : true;
2