gpt4 book ai didi

typescript - 当其中一种类型是 any 时,为什么类型推断不适用于联合类型?

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

当我使用其中一个类型为 any 的联合类型时,TypeScript 编辑器似乎无法正确解析该类型。我有以下人为的例子:

interface ITest {
name: string;
age: number;
}

interface ITest2 {
last: string;
dob: number;
}

function isGood(input: any) : input is ITest{
return 'name' in input && 'age' in input;
}

function doIt(){
var data : ITest2 | ITest = {
last: 'Test', dob: 123
}

var data2 : any | ITest = {
name: 'else', age: 45
}

if(isGood(data)){
alert(`name:${data.name}, age:${data.age}`); // data shows ITest
}

if(isGood(data2)){
alert(`name:${data2.name}, age:${data2.age}`); // data2 shows any
}
}

doIt();

代码确实执行正确,但设计时体验不是我所期望的(在 VS Code - 1.4.0 和 TypeScript playground - 1.8 中)。

正如预期的那样,以下行根据类型保护推断出 dataITest 类型。

alert(`name:${data.name}, age:${data.age}`); // data shows ITest

但是,第二部分(带有 data2)没有推断出正确的类型,并且始终是 any:

alert(`name:${data2.name}, age:${data2.age}`); // data2 shows any

在上面的行中,我希望 intellisense 知道 data2ITest 类型,就像它之前对 data 所做的那样。

我已经尝试在联合声明中交换这两种类型,但它并没有改变结果。

我错过了什么吗?

用例

我面临的真实用例是我从某些 HTTP 调用中获得响应。马上,它必须是 any 类型,因为 HTTP 客户端对我们的数据类型一无所知。

但是,我想编写一个用户定义的类型保护来检查我们想要的 json 对象的属性,然后只提取我们需要的数据并返回它。

最佳答案

它扩展了任何类型以包含类型保护。 any 已经比 ITest 宽,所以它选择 any。如果您将其更改为更窄的类型,它会正确推断出 ITest:

var data2 : {} | ITest = {
name: 'else', age: 45
}

发生这种情况的原因是因为 any 是可以想象到的最广泛的类型,它同时是所有其他类型,所以 any | ITest 没有任何意义,这与 any 相同。

编辑:我还想指出,即使关闭了隐式任何类型,也可以简单地删除类型。不确定这是否有帮助。示例:

var data2 = {
name: 'else', age: 45
}

第二次编辑:稍微重写了答案以使其更加清晰,正如评论所指出的那样,有些困惑。

关于typescript - 当其中一种类型是 any 时,为什么类型推断不适用于联合类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39232876/

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