使用以下代码:
function foo() : void {
// do something
}
var f = foo(); // why no error here?
即使已将foo函数声明为而不是返回任何内容,也不会产生编译器警告/错误。
我想阻止的另一个案例是:
if (foo()) {
}
我正在构建一个供其他开发人员使用的API,TypeScript可以很好地鼓励类型安全,并且通常有助于捕获常见的JavaScript错误,否则这些错误只会在测试时而不是在编译时捕获。虽然这种情况显然不会像C#这样在其他语言中处理,但这种情况并没有得到解决。开发人员通常会成为客户,可能没有那么多的经验,所以我想让平台尽可能健壮,并在部署代码之前捕获尽可能多的问题。
是否有一些合理的方法来构造代码以防止其他代码尝试使用没有返回值的函数的undefined
结果?如果foo
没有返回任何内容,我宁愿代码只能将其称为foo();
,并且在执行赋值(或类似执行)时不会无意中期望有效的返回值。< / p>
其他编程语言通常会在编译时捕获这种类型的代码结构(并显示警告/错误)。
答案 0 :(得分:2)
这是因为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中允许任何如果声明。也许你想要boolean
只有真实/伪造的限制。
if (f()) {
}
答案 1 :(得分:0)