首页 > 解决方案 > 如何在打字稿中使用联合类型

问题描述

我在一个项目中使用打字稿,在其中的某些部分我必须使用联合类型。但是我收到了一些奇怪的错误消息,我不知道如何处理。考虑以下类型:

type body = {
  [_: string]:
    | 'boolean'
    | 'number'
    | 'string'
    | {
        type: 'boolean' | 'number' | 'string'
        optional?: boolean
      }
    | {
        type: 'array'
        items: 'boolean' | 'string' | 'number'
        optional?: boolean
        [_: string]: any
      }
}

我正在使用[_: string]:,因为我应该能够使用任意键。该值可以是指示类型的字符串,也可以是提供更多详细信息的对象。现在考虑以下函数:

function show(data: body) {
  console.log(data)
}

当我使用以下对象调用上述函数时:

const data = {
  username: { type: 'string', optional: false },
  address: { type: 'string' },
  city: 'string'
}

打字稿给出以下错误:

类型参数 '{ username: { type: string; 可选:布尔值;}; 地址:{类型:字符串;}; 城市:字符串;}' 不可分配给“body”类型的参数。

属性“用户名”与索引签名不兼容。

类型'{类型:字符串;可选:布尔值;}' 不可分配给类型 '"string" | "数字" | “布尔” | {类型:“字符串”| "数字" | “布尔”;可选?:布尔值 | 不明确的; } | { [_:字符串]:任何;类型:“数组”;项目:“字符串”| "数字" | “布尔”;可选?:布尔值 | 不明确的; }'。

类型 '{ type: string; 中缺少属性 'items' 可选:布尔值;}' 但在类型 '{ [_: string]: any; 类型:“数组”;项目:“字符串”| "数字" | “布尔”;可选?:布尔值 | 不明确的; }'。

我该如何解决这个问题?谢谢

标签: javascriptnode.jstypescript

解决方案


您可以明确声明您的属性data是什么类型

const data: body = {
  username: { type: 'string', optional: false },
  address: { type: 'string' },
  city: 'string'
}

或投它

const data = {
  username: { type: 'string', optional: false },
  address: { type: 'string' },
  city: 'string'
} as body;

推荐阅读