首页 > 解决方案 > TS2531:检查所有备选方案时数据可能为空?

问题描述

TS 游乐场:https ://go.mpen.ca/39icg

代码:

enum ErrorType {
    PARSE = 'parse',
    SERVER = 'server',
    NETWORK = 'network',
}

type State<TData=any> = ({
    loading: true,
    data: null,
    error: null,
} | {
    loading: false,
    data: TData,
    error: null,
} | {
    loading: false,
    data: null,
    error: {
        type: ErrorType
        [k:string]: any
    }
}) & {abort: ()=>void}

function f<T>(): State<T> {}

function main() {
    const {loading,data,error} = f<{foo:string}>()

    if(loading) return
    if(error) return

    console.log(data.foo)  // Object is possibly 'null'.(2531)
}

如果loading为假,则TState必须有dataerror。如果error是假的,那么它一定有data

为什么 TypeScript 抱怨data可能出现null在这种情况下?我已经检查过loadingerror

标签: typescript

解决方案


您正在将您的状态解构为多个变量。那时,TypeScript 将不再将它们一起键入。每个都单独输入。

如果你想让它起作用,你需要把它们放在一起。

function main() {
    const state = f<{foo:string}>()

    if(state.loading) return
    if(state.error) return

    console.log(state.data.foo)  // no error
}

推荐阅读