【问题标题】:Forcing error in TypeScript compile with void return使用 void return 在 TypeScript 编译中强制出错
【发布时间】:2014-06-21 06:37:05
【问题描述】:

使用以下代码:

function foo() : void {
   // do something
}

var f = foo();  // why no error here?

即使 foo 函数已声明为返回任何内容,这也不会产生编译器警告/错误。

我想防止的另一种情况是:

if (foo()) {

}

我正在构建一个供其他开发人员使用的 API,TypeScript 可以很好地促进类型安全,并且通常有助于捕获常见的 JavaScript 错误,否则这些错误只会在测试时而不是在编译时被捕获。虽然这种情况显然没有处理,但它会在 C# 等其他语言中处理。开发人员通常是客户,可能没有太多经验,所以我想让平台尽可能健壮,并在部署代码之前发现尽可能多的问题。

是否有一些合理的方法来构造代码以防止其他代码尝试使用没有返回值的函数的undefined 结果?如果foo 不返回任何内容,我宁愿代码只能将其称为foo();,而不是在执行赋值(或类似执行)时无意中期望一个有效的返回值。

其他编程语言通常会在编译时捕获这种类型的代码结构(并显示警告/错误)。

【问题讨论】:

  • 您是如何发现这一点的?这是您发现的真实代码的简化示例吗?在运行时意外损坏了,而您原本预计它会被 TypeScript 编译器捕获?
  • 这是真实事物的简化示例。

标签: typescript


【解决方案1】:

这是因为void 是一个有效 TypeScript 类型声明。例如以下是有效的

var f:void;

然而它有用作为变量类型。

来自语言规范 (http://www.typescriptlang.org/Content/TypeScript%20Language%20Specification.pdf):

注意:我们可能会考虑禁止声明 Void 类型的变量,因为它们没有任何用处。 但是,由于允许 Void 作为泛型类型或函数的类型参数,因此不可行 禁止 Void 属性或参数。

更新: 正如 Ryan 所指出的:https://twitter.com/SeaRyanC/status/479664200323579904 如果f:void 被禁止,您不会获得太多附加 类型安全性。您不能以有意义的方式使用f,例如以下都是编译错误。

var f:void;

f.bar; // error 
function bar(f:{}){}
bar(f); // error
var baz:{a?:number} = f; // error


// Only allowed cases
f = undefined;
f = null;

对你的真实案例感到好奇。

基于问题更新的更新: 不幸的是,我看不到让编译器阻止这种情况的方法,因为在 JS/TS if 语句中允许 anything .也许你想要一个 boolean 唯一的真/假限制。

if (f()) {

}

【讨论】:

  • 我真的在寻找一种将函数声明为 not 返回值的方法。不幸的是,void 与其他编程语言中的 void 不同(这使得它成为语言作者的一个奇怪的选择)。
  • @WiredPrairie 查看更新。你错过了什么安全
  • 我添加了更多细节。简单的总结是我希望代码尽可能健壮,编译器尽可能多地捕获。虽然肯定有测试和 QA 可以理想地捕捉到这一点,但我希望无需额外努力就能捕捉到这一点。
  • 另一种不会失败的情况是函数 f(a: any){}(外部库就是这种情况)。我同意 WiredPrairie 的观点,这应该是在分配时而不是在使用时发现的......但我想设计选择背后有一些动机。
【解决方案2】:

我相信如果你尝试:

var f:number=foo();

它将返回您要查找的错误。我认为无类型变量默认为“any”,这使得它不检查类型。

链接here

【讨论】:

  • 是的,如果你声明了一个类型,这将起作用。但是不需要声明类型,因为类型是隐含在声明中的。 f 变量实际上是 void 类型。
猜你喜欢
  • 2019-08-01
  • 1970-01-01
  • 2018-02-14
  • 1970-01-01
  • 2021-08-06
  • 2013-05-23
相关资源
最近更新 更多