【问题标题】:Typescript define array that can contain only specific strings打字稿定义只能包含特定字符串的数组
【发布时间】:2018-07-24 17:50:17
【问题描述】:

我很困惑为什么以下错误,我有字符界面

interface Character {
 race: "ORC" | "ELF" | "HUMAN" | "DWARF"
}

还有一个界面酒馆

interface Tavern {
  races: Character['race'][]
}

这里的想法是,races 是一个字符串数组,只能是 "ORC" | "ELF" | "HUMAN" | "DWARF"

由于某种原因,当我像这样使用它时出现错误

const tavern: Tavern = {
   races: ["ORC", "ELF", "HUMAN", "DWARF"]
}

错误内容如下

[ts] 类型“{ races: string[] }”不可分配给类型“Tavern”。 财产“种族”的类型是不相容的。 类型 'string[]' 不能分配给类型 '("HUMAN" | "ORC" | "ELF" | "DWARF")[]'。 类型 'string' 不可分配给类型 '"HUMAN" | “兽人” | 《精灵》 | “矮人”。

【问题讨论】:

  • 2.9.2,很奇怪,我不确定还有什么可能导致该错误,将进一步研究
  • 是的,您的确切代码我也没有收到任何错误。我打算建议一个辅助函数来推断文字类型而不是string,但有些东西在起作用typescriptlang.org/play/…

标签: typescript


【解决方案1】:

这是一个古老的打字稿故事,您很可能必须这样做:

const tavern: Tavern = {
   races: ["ORC", "ELF", "HUMAN", "DWARF"] as Array<Character['race']>
}

可能

type Race = "ORC" | "ELF"

const tavern: Tavern = {
   races: ["ORC" as Race, "ELF" as Race]
}

这应该可以工作

enum Race = { ORC, ELF }

interface Tavern {
  races: Race[]
}

const tavern: Tavern = {
   races: [Race.ORC, Race.ELF]
}

【讨论】:

  • 第一个成功了。您是否可以参考任何来源或 github 问题来更深入地探讨这一点?
  • 我不确定是否有任何引用,但问题是 typescripts 最初将您的数组视为常规 string[]。顺便说一句,我已经更新了答案 - 枚举在这里可能是一个不错的选择,如果你想与其他系统进行健全的互操作,它们可以像 ORC = "ORC" 一样保存值
猜你喜欢
  • 2019-12-07
  • 2022-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多