我错过了什么?
这是:
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
2条答案
按热度按时间46scxncf1#
考虑以下
A
的有效实现:即使检查了
if (maybeFoo.b) {...}
,也不能保证getter在undefined
已经传递给f2
时不会返回undefined
。yrefmtwq2#
我认为这段代码对你有帮助。