Typescript strictNullChecks检查函数之间的关系
Typescript strictNullChecks checking across functions
启用--strictNullChecks
后,如果检查发生在单独的函数中,tsc似乎无法推断出可选属性不是未定义的。(参见示例,因为我无法清楚地表达)。
给定一个带有可选属性的接口,如
interface Foo {
bar?: {
baz: string;
};
}
编译以下代码:
//compiles
function doStuff(foo: Foo) {
if (foo.bar === undefined) {
throw new Error("foo.bar must be defined");
}
foo.bar.baz;
}
这段代码没有,因为tsc认为foo。
//does not compile, foo.bar can be undefined
function doStuff2(foo: Foo) {
validateFoo(foo);
foo.bar.baz;
}
function validateFoo(foo: Foo) {
if (foo.bar === undefined) {
throw new Error("foo.bar must be defined");
}
}
为什么会这样?有没有办法把一个函数标记为一个可以检查未定义和null的东西?如果可能的话,我想避免foo.bar!.baz
。在这个例子中,很容易内联if/throw,但如果Foo有多个需要在多个函数中检查的可选属性,它就会变得重复。
为什么会这样?
你可以想象TypeScript试图内联这个函数,但是为了得到一个准确的结果,你需要内联validateFoo
调用的每个函数——这可以任意深入。
实际上在TypeScript的问题跟踪器中有一个完整的讨论。
是否有办法将函数标记为可以检查未定义和null的东西?
Sort of -有类型谓词,如果函数返回true
,它是告诉TypeScript参数类型的函数。
function validateFoo(foo: Foo): foo is { bar: { baz: string } } {
if (foo.bar === undefined) {
throw new Error("foo.bar must be defined");
}
return true;
}
你可以这样使用:
function doStuff(foo: Foo) {
if (!validateFoo(foo)) {
throw foo;
}
foo.bar.baz;
}
相关文章:
- JSDoc:模块和名称空间之间的关系是什么
- html5视频播放器和视频js之间的关系
- 两个集合mongodb之间的关系
- angular2@组件和类之间的关系
- 在Knockout.js模型中创建项之间的关系
- Angular 2,在没有直接关系的两个组件之间共享一个对象
- 视图和路由器之间的主干关系
- JavaScriptV5中的绑定和JQuery之间有任何关系吗
- 高图 - 分组/近似后保持多个系列之间的关系
- 父关系指令和子关系指令之间的绑定
- 绘制的节点和Google图表/可视化中的数据节点之间的关系
- 如何解决存储中操作之间的依赖关系
- 负载角度依赖关系之间的区别是什么,共享模块的最佳方式是什么
- 如何管理原始对象之间的数据依赖关系
- undercore.js-包含和减少之间的关系
- 如何在不让web组件的原型进入全局命名空间的情况下维护它们之间的依赖关系
- 什么's JavaScript和HTML之间的关系
- 命名空间和词法范围之间的关系是什么
- JS:“data-background-color”和.data(“background-color”)之间的关系
- 突出显示一组节点及其之间的关系