gpt4 book ai didi

typescript - Intellisense 说该属性在 Class1 和 Class2 中不存在

转载 作者:搜寻专家 更新时间:2023-10-30 21:46:10 25 4
gpt4 key购买 nike

这是我的代码,我知道它有点长但不难理解。它在最后一行显示错误,并且在那里也失去了智能感知。“属性‘test’在类型‘Test | Test2’上不存在。”如您所见,“测试”属性显然在“测试”类中。那怎么了?

class Test{
test: string = 'test';
}
class Test2{
test2: string = 'test2';
}

function isTest(obj: Test|Test2): obj is Test{
if(obj instanceof Test)
return true;
else
return false;
}

function test(obj: Test|Test2): Test|Test2{
if(isTest(obj))
return obj as Test;
else
return obj as Test2;
}



let varTest: Test = new Test();
console.log(test(varTest).test); //this line is broken

最佳答案

为什么它不起作用

test() 的返回类型是静态的,因为它的返回值总是Test | Test2,不管它怎么叫。这意味着 varTest 可以是 TestTest2(不包含 test 属性),因此错误正确地让您知道您尝试访问的属性可能不存在。

如果我们需要动态返回类型,我们需要求助于泛型、重载或条件类型,具体取决于问题。对于您的情况,我们可以使用函数重载。

工作解决方案

Function overloads允许您指定以输入类型为条件的返回类型。为了使您的 test() 函数按预期工作,我们用两个条件重载它:一个用于 Test,另一个用于 Test2:

function test(obj: Test): Test; // given Test, return Test
function test(obj: Test2): Test2; // given Test2, return Test2
function test(obj: Test | Test2): Test | Test2{
if(isTest(obj))
return obj as Test;
else
return obj as Test2;
}

let varTest: Test = new Test();
console.log(test(varTest).test); // OK

let varTest2: Test2 = new Test2();
console.log(test(varTest2).test); // Error! 'test' does not exist in Test2

参见 playground link .

关于typescript - Intellisense 说该属性在 Class1 和 Class2 中不存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54541835/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com