なぜTypeScriptは分割代入するときに判別型を推論できないのか
オブジェクトの分割代入で識別された型を絞り込もうとしますが、無駄に終わります。TypeScriptはv4.4以降、それを推論できると思っていました。
しかし、私はこのコードではそれを行うことができません(あくまでアイデアの例です):
type WritableRecord = {
someField: 'a'
}
type ReadonlyRecord = {
otherField: 'b'
}
type Writable = {
readonly: false;
} & WritableRecord;
type Readonly = {
readonly: true;
} & ReadonlyRecord;
export type RecordProps = Readonly | Writable
type Fn = (props: RecordProps) => void
const fn: Fn = ({ readonly, ...props }) => {
switch (readonly) {
case true:
const readonlyCheck: ReadonlyRecord = props
break;
case false:
const writableCheck: WritableRecord = props
break
}
}
しかし、分解せずに使うと動作します:
type WritableRecord = {
someField: 'a'
}
type ReadonlyRecord = {
otherField: 'b'
}
type Writable = {
readonly: false;
} & WritableRecord;
type Readonly = {
readonly: true;
} & ReadonlyRecord;
export type RecordProps = Readonly | Writable
type Fn = (props: RecordProps) => void
const fn: Fn = (props) => {
switch (props.readonly) {
case true:
{
const { readonly, ...readonlyProps } = props
const readonlyCheck: ReadonlyRecord = readonlyProps
break;
}
case false:
{
const { readonly, ...writableProps } = props
const writableCheck: WritableRecord = writableProps
break;
}
}
}
もしかしたら、私がv4.4の発表を間違えているのか、それとも何かエラーがあるのか?
回答 #1
あなたはちょうど、現在(TS4.7時点)では分解された残余要素の制御フロー解析のサポートがないことを発見しました。これはTypeScriptの既知の未実装機能であり、microsoft/TypeScript#46680でリクエストされています。
もしこれをサポートしてほしいなら、その問題に行って 👍 をつけるといいかもしれませんが、どちらにしてもあまり効果はないでしょう。現時点では、2番目の例で行ったように、判別プロパティを確認した後にのみ残りの要素を分解する必要があるでしょう。