我试图定义一个类型Result,它有一个可选的数据类型.

我当前的类型定义是:

type Result<Data = void> = {
  tx: string,
  data: Data
}

但它有以下问题(第2行未通过):

const ret: Result<{userId: string}> = {tx: "123", data: {userId: "456"}} // it is GOOD!
const ret: Result = {tx: "123"} // it will complain missing data, how can we pass it?

有人能帮忙吗?非常感谢.

推荐答案

void在期望表达式值的上下文中没有意义——void就像说根本没有值(不是undefinednull,而是没有任何与之相关的值).因此,将属性值键入void没有意义,就像

const foo: void = <anything>

没有意义——除非您显式使用返回void类型的东西,这真的很奇怪(最好不要传递它).

一种方法是使用条件对象类型:

type Result<Data = void> = void extends Data
  ? {
    tx: string
  }
  : {
    tx: string,
    data: Data
  };

const ret: Result<{ userId: string }> = { tx: "123", data: { userId: "456" } } // Good
const ret2: Result = { tx: "123" } // Good
const ret3: Result = { tx: "123", data: 'foo' } // Bad

Typescript相关问答推荐

在Switch陈述中输入保护类

使用前的组件渲染状态更新

了解TS类型参数列表中的分配

使用Angular和API请求在CRUD操作后更新客户端数据的良好实践

将props传递给子组件并有条件地呈现它''

为什么TypeScript失go 了类型推断,默认为any?''

与字符串文字模板的结果类型匹配的打字脚本

在MessageStore对象中实现条件类型时出现TypeScrip错误

无法从Chrome清除还原的初始状态数据

在函数中打字推断记录的关键字

在分配给类型的只读变量中维护const的类型

嵌套对象的类型

使用Redux Saga操作通道对操作进行排序不起作用

类型脚本可以推断哪个类型作为参数传递到联合类型中吗?

如何在脚本中输入具有不同数量的泛型类型变量的函数?

为什么TypeScrip不能解析对象析构中的赋值?

如何在不违反挂钩规则的情况下动态更改显示内容(带有状态)?

在Thunk中间件中输入额外参数时Redux工具包的打字脚本错误

如何使用 runInInjectionContext 中的参数测试功能性路由防护

Typescript 子类继承的方法允许参数中未定义的键