ウェブサイト検索

なぜ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番目の例で行ったように、判別プロパティを確認した後にのみ残りの要素を分解する必要があるでしょう。