【问题标题】:Typescript: cannot cast down to generic "Record<string, string>" type?打字稿:不能转换为通用的“记录<字符串,字符串>”类型?
【发布时间】:2019-07-31 05:32:13
【问题描述】:

为什么打字稿不允许我投射以下内容:

interface foo {
  foofoo: string
  feefee: string
  faafaa: 'red' | 'blue'
}

进入Record&lt;string, string&gt;?我该如何做到这一点?

我试过了:

  • 将字符串文字 red|blue 更改为 string 类型
  • 试过instanceOfFoo as Record&lt;string, string&gt;
  • 尝试将其更改为类型而不是接口

...没有任何帮助表示高兴

【问题讨论】:

  • 那有三个字符串,你想要一个有两个字符串的记录。
  • 这不是一个有效的接口声明,= 仅用于类型别名中...实际上适用于此分配。
  • 抱歉打错了...我在类型和界面之间切换,尝试不同的东西。将纠正问题@a
  • 它应该使用类型别名:github.com/microsoft/TypeScript/issues/15300 -- 发布您的实际代码和错误?

标签: typescript


【解决方案1】:

TypeScript 在这里发出错误信号并不是因为这两种类型不能相互分配,而是因为它们没有共同的属性,这几乎总是错误的,以及关于错误的说明在没有的情况下该怎么做是相当清楚的。

类型 'foo' 到类型 'Record' 的转换可能是一个错误,因为这两种类型都没有充分重叠。如果这是故意的,请首先将表达式转换为“未知”

强调我的。

所以你需要做的就是

declare const x: foo; // there exists a variable x of type foo.
const y = x as unknown as Record<string, string>; // cast to unknown, then to Record.

Playground link

【讨论】:

  • 这是我的确切错误信息,您的解决方案有效!谢谢!我拒绝强制转换为未知,因为我已经习惯了 linter 抱怨“任何”类型并将两者混淆......
  • 或者你可以只使用类型别名而不是接口。
  • @AaronBeall 项目的 linter 没有让我这么做,但谁知道呢……这可能是因为我做错了其他事情。我觉得你 100% 是对的!谢谢你的信息。打字稿超级新手。
  • 我只是注意到一年前没有接受这个??诡异的!接受!
猜你喜欢
  • 2020-05-08
  • 2019-06-05
  • 1970-01-01
  • 2019-09-20
  • 1970-01-01
  • 2019-11-12
  • 2020-11-21
  • 2023-02-10
  • 2020-11-15
相关资源
最近更新 更多