我有以下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。
答案 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