gpt4 book ai didi

javascript - TypeScript 中的对象类型转换

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

使用 enum 进行类型转换在 TypeScript 中工作得非常好,直到你想通过 util 函数来完成它。这是一个例子:

enum MyTypes {
FIRST = "FIRST",
SECOND = "SECOND",
THIRD = "THIRD"
}

type TFirst = {
type: MyTypes.FIRST
foo: string
}

type TSecond = {
type: MyTypes.SECOND
foo: string
}

type TThird = {
type: MyTypes.THIRD
bar: string
}

type TMyObject = TFirst | TSecond | TThird

const someFunction = (myObject: TMyObject) => {
if (myObject.type === MyTypes.FIRST || myObject.type === MyTypes.SECOND) {
// here typescript knows exactly that myObject is TFirst or TSecond
console.log(myObject.foo)
}
}

const isFirstOrSecondUtil = (myObject: TMyObject): boolean => {
return myObject.type === MyTypes.FIRST || myObject.type === MyTypes.SECOND
}

const otherFunction = (myObject: TMyObject) => {
if (isFirstOrSecondUtil(myObject)) {
// typescript is aware that myObject is TMyObject, but does not know which type exactly
console.log(myObject.foo)
}
}

可以在TypeScript Playgroud中测试.

正如您在 someFunction 中第 27 行看到的那样TypeScript 充分意识到 myObject类型为 TFirstTSecond即使该函数收到 TMyObject .我可以使用 myObject.foo没有任何问题,因为这两种类型都有。

另一方面,我正在使用 util 函数 isFirstOrSecondUtil (与在 someFunction 中所做的检查相同)在 otherFunction 中在这种情况下,显然类型检查失败了。在第 38 行,TypeScript 不知道 myObject 到底是哪种类型.我希望能够安慰 myObject.foo , 但 TypeScript 失败并显示 Property 'foo' does not exist on type 'TThird'.

关于如何通过 util 函数进行正确的类型转换,有什么建议吗?

最佳答案

您可以告诉 Typescript 返回的 bool 值表示类型:

 const isFirstOrSecondUtil = (myObject: TMyObject): myObject is TFirst | TSecond => 
myObject.type === MyTypes.FIRST || myObject.type === MyTypes.SECOND;

docs

关于javascript - TypeScript 中的对象类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57160283/

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