Javascript Typescript检查跨函数的检查

Javascript Typescript检查跨函数的检查,javascript,typescript,typescript2.0,Javascript,Typescript,Typescript2.0,启用--stricnullchecks后,如果检查发生在单独的函数中,tsc似乎无法推断可选属性未定义。(参见示例,因为我很难清楚地表达这一点) 给定一个具有如下可选属性的接口 interface Foo { bar?: { baz: string; }; } 编译以下代码: //compiles function doStuff(foo: Foo) { if (foo.bar === undefined) { throw new Err

启用
--stricnullchecks
后,如果检查发生在单独的函数中,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.bar可以未定义:

//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尝试为此内联函数,但为了获得准确的结果,您还需要内联
validatefo
调用的每个函数,这可以是任意深度的

事实上,关于这一点有一个完整的讨论

有没有办法将函数标记为可以检查未定义和null的对象

排序-有类型谓词,如果函数返回
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;
}
为什么会这样

您可以想象TypeScript尝试为此内联函数,但为了获得准确的结果,您还需要内联
validatefo
调用的每个函数,这可以是任意深度的

事实上,关于这一点有一个完整的讨论

有没有办法将函数标记为可以检查未定义和null的对象

排序-有类型谓词,如果函数返回
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;
}

这里似乎对我有用-@gkb有没有办法在jsfiddle中指定使用哪个版本的tsc,以及使用编译器标志?strictNullChecks默认为false,仅在typescript 2.0+中。抱歉,我完全没有看到tsc<2.0+的strictNullChecks。这里似乎对我有用-@gkb是否有办法在JSFIDLE中指定使用哪个版本的tsc,以及使用编译器标志?strictNullChecks默认为false,仅在typescript 2.0+中。抱歉,我完全没有看到tsc<2.0+的strictNullChecks。