TypeScript `undefined`保护

lg40wkob  于 2023-06-30  发布在  TypeScript
关注(0)|答案(2)|浏览(113)

我错过了什么?
这是:

interface B { }
interface A {
    b: B | undefined;
}

function f1(a: A) {
    if (a.b) {
        return f2(a);
    }
}
function f2(a: { b: B }) { }

生成:

// Errors in code
// 
// Argument of type 'A' is not assignable to parameter of type '{ b: B; }'.
//   Types of property 'b' are incompatible.
//     Type 'B | undefined' is not assignable to type 'B'.
//       Type 'undefined' is not assignable to type 'B'.
// 'arg' is declared but its value is never read.

我能想到的if测试的所有其他排列也失败了。(显式检查not-undefined,将其反转并返回if undefined等)
Playground链接:
https://www.typescriptlang.org/play?#code/JYOwLgpgTgZghgYwgAgELIN7IL4ChSSyIoCCmuylyARgFxrIA+yAriACYQygTsDcuPLhhsEYYAHsQyGAEYAFHHokAlOSrJgMZIoB01NRgoaqUCGBZRpMAEyKVAjXjwiQYydbtLMNeumyGOLi4APQhyACiUFASUADOmtIIEpyh4WnIJFAA5iwAthDgyBLaYACeAA4oAOQk1ZoJIBJgyHBxccDZIHDUADYoYBLIFXBQcAWExaWVNVh0aHw41boZlAAqMwklwzFVUOXI1dT1oyigyXkj4n0QK2EmG1WH6MxsnNwgvPXAjc2t7Z1ujdkIMQTNnstVg9wdU3lweOxvr8Wm0Ol0ev0QUNyk9qqhIfdqqNskjkJwEL1TuwaCwWsAwAkAG5wXosM6NCCM6DIMxwdi6IA
所以@Etheryte建议的“非确定性getter”绝对不是我想到的案例。
但TS似乎也没有真正处理好它?
调整到这个:

interface B { i: string; }
interface A { b: B | undefined; }

function f1(a: A) {
    if (a.b) {
        return f2(a.b);
    }
}
function f2(b: B) {
    console.log(b.i);
}

const maybeFoo: A = {
    get b() {
        if (Math.random() > 0.5) { return { i: "foo" }; }
        return undefined;
    }
};

// Here's the test!
f1(maybeFoo);

它编译、运行,并且(大约1/4的时间)失败!

[ERR]: "Executed JavaScript Failed:" 
[ERR]: Cannot read properties of undefined (reading 'i') 
[LOG]: "foo"

Playground with those tweaks:
https://www.typescriptlang.org/play?ssl=30&ssc=4&pln=23&pc=1#code/JYOwLgpgTgZghgYwgAgELIN7OALmQZzClAHMBuZAXwChRJZEUBBTZAIz3QB9kBXEACYQYoCAIo1qMfgjDAA9iGQwAjAAo4eJgEpM1ZAewxkGgHRtdGfYZtQIYXlCUwATGYtlrBmjWkhZCs5uHGiWXsgIivjyADYQpjHyJGpspsDanpKRIITIALZwAJ5sEABi8vJayAC8ejYk9uxqYTY2wMZqALJwYAAWplBwgvJ5zcgAfMgADKYArJbIdg5OrLjIAEQwFetUEuG29o5K-EIiIGKeNj6e1AD0t8gAEtAQAOT4yH0okIQAhFLqArFMoVDLUO4PAAqvWAH0ieQADsA4h8hgJFvx8AAadi8MDIBrnQY-ZDQKDyKCotjyPHIFS3AAsn1632AeQgv2QEK592QAAMBdyANoAUQASmKALp4dYigAeEAQeLEyAAUnAAG5wADKCGICPxpTgyLEOB2wvFUrwAGEhiB5Pi7HB0QjyQjoHIIB95MYTsJROi1E6BKRkK9gK9dMKADIAeQA4tKNlt5ObeQK+dygA

46scxncf

46scxncf1#

考虑以下A的有效实现:

const maybeFoo: A = {
    get b() {
        if (Math.random() > 0.5) {
            return "foo";
        }
        return undefined;
    }
};

即使检查了if (maybeFoo.b) {...},也不能保证getter在undefined已经传递给f2时不会返回undefined

yrefmtwq

yrefmtwq2#

我认为这段代码对你有帮助。

function f1(a: A) {
    const { b } = a;
    if (b) {
        return f2({ b });
    }
}

相关问题