类型确定不正确

时间:2019-04-01 19:23:51

标签: typescript

我有以下example

interface LoadingState {
    state: 'loading';
}
interface DoneState {
    state: 'done';
    data: any;
}

const test = (params: LoadingState | DoneState) => {
    const { state } = params;
    if ( state === 'loading') {
        return console.log('LoadingState');
    }
    const { data } = params
}         

该代码的最后一行抛出错误:Property 'data' does not exist on type 'LoadingState | DoneState'.我目前正在通过显式类型转换来规避此问题:

const { data } = this.state as DoneState<T>;

问题是,TS 知道状态的唯一有效选项是“完成”,这意味着必须定义数据。我想念什么吗?我应该以不同的方式定义我的界面吗?


编辑

我什至没有问过我的问题。抱歉!!原来我的问题比我想的还要复杂!我有类似this的内容:

interface LoadingState {
    state: 'init' | 'loading';
}
interface DoneState {
    state: 'done';
    data: any;
}
const test = (params: LoadingState | DoneState) => {
    const {state} = params;
    if ( state === 'loading' || state === 'init') {
        return console.log('LoadingState');
    }
    const {data} = params;
}      

要解决此问题,我不仅必须避免破坏参数,而且还必须为InitState添加新接口以拆分state: 'init' | 'loading';定义。这是工作中的result

2 个答案:

答案 0 :(得分:1)

typescript实际上不知道您是否在测试if条件中的参数类型。您可以明确地告诉编译器您正在使用类型防护来进行此操作:ts-playground

答案 1 :(得分:0)

  

问题是,TS知道状态的唯一有效选项是“完成”

是的,但不会使连接从变量params的类型返回到state的对象params.state的类型。如果您在if内使用const test = (params: LoadingState | DoneState) => { if ( params.state === 'loading') { return console.log('LoadingState'); } const { data } = params } ,请检查其是否按预期工作:

yday_mnth