【问题标题】:Eliminating type ambiguity in TypeScript消除 TypeScript 中的类型歧义
【发布时间】:2015-09-08 04:38:06
【问题描述】:

假设我有这样的代码:

function defaultIt(s: MaybeString): string {
  if (typeof s.content === "string") {
    return s.content;
  }

  return "";
}

class MaybeString {
  content: string|void;
}

如果我错了,请纠正我,但我相信这是你能得到的最安全的类型;任何适合MaybeString 的可能输入都将生成一个字符串。但是,TypeScript 给了我一个错误:Type 'string | void' is not assignable to type 'string'

如何让 TypeScript 通过检查类型来识别我已经消除了歧义?

谢谢!

【问题讨论】:

  • 诚然,我只使用 Typescript 几个月,但将 content 键入为 string|void 是否有意义?这是“联合类型”对吗?所以你说的是content属性只有stringvoid之间共有的属性(因为void根本没有属性,string|void基本上是一样的如void)。您是想说content 属性是可选的并且可能没有值吗?
  • 我想我误解了。我认为这有点像“也许”之类的东西。有没有办法说它可以是 either 字符串或 void?
  • 我删除了我的答案 b/c 它是关于接口上的可选属性。但是如果类属性是可选的,你基本上不需要做任何特别的事情(关于打字稿声明)。这是你指出我的错误后我得出的结论,并得到this answer的支持。
  • 我想我的问题更笼统,但我试图简化它。例如,如果我想将其设为字符串或函数怎么办?

标签: typescript


【解决方案1】:

目前您可以使用附加变量:

var temp:string|void = s.content;

if (typeof temp === "string") {
   return temp;
}

sample

或者转换成字符串:

if (typeof s.content === "string") {
   return <string>s.content;
}

sample

对于你可以使用instanceOf函数的类,详见this article

【讨论】:

  • 考虑到s.content 已经是string|void 类型,你可以这样做有点奇怪
猜你喜欢
  • 1970-01-01
  • 2018-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多