在typescript中定义对象形状变量

在typescript中定义对象形状变量,typescript,Typescript,我试图定义一个对象,它既可以包含数据,也可以包含错误 导出类型ActionResult={ 资料:有; } | { 错误:任何; }; 函数测试():ActionResult{ 返回{ 数据:3 } } 尝试访问函数结果时,我得到: const v=test(); v、 数据=23;//类型“ActionResult”上不存在属性“data”。类型{error:any;}上不存在属性“data” 访问“数据”或“错误”的正确方法是什么?以下是TypeScript如何理解您的代码: const

我试图定义一个对象,它既可以包含数据,也可以包含错误

导出类型ActionResult={
资料:有;
} | {
错误:任何;
};
函数测试():ActionResult{
返回{
数据:3
}
}
尝试访问函数结果时,我得到:

const v=test();
v、 数据=23;//类型“ActionResult”上不存在属性“data”。类型{error:any;}上不存在属性“data”

访问“数据”或“错误”的正确方法是什么?

以下是TypeScript如何理解您的代码:

const v = test();
// v: {data: any} | {error: any}
v.data = 23;
// It is possible that 'v' is of type '{error: any}'
// In this case, an error might happen at runtime
// This error must be prevented right now - time to throw a TS error!
确保不会发生这种情况的一种方法是使用将联合类型限制为不会引发TS错误的类型:

const v = test();
// v: {data: any} | {error: any}
if ('data' in v) {
  // v: {data: any}
  v.data = 23;
  // no error!
}
您还可以通过在定义
v
时强制转换
v
来告诉TypeScript您确信
v
将具有
数据

const v = (test() as {data: any});
v.data = 23;

上检查此代码这是一个有区别的联合的解决方案(我为每个联合成员添加了一个公共属性数据类型):


谢谢有没有一种方法可以明确地说:“我知道结果只包含数据,不会有错误”@reflog由于您将类型命名为
ActionResult
,我假设您将使用它来键入API响应。如果是这样,我强烈建议你过度思考你的设计。根据是否存在错误,端点不应返回两个不同的模型。相关:
export type ActionResult = {
  dataType: "value",  
  data: any
} | {
  dataType: "error",  
  error: any
};

function test():ActionResult {
    return {
        dataType: "value",
        data: 3
    }
}

const v = test();
if ("value" === v.dataType){
   v.data = 23;
}