gpt4 book ai didi

javascript - 在 Typescript 中克隆对象,从 Flow 迁移

转载 作者:行者123 更新时间:2023-11-30 14:22:23 25 4
gpt4 key购买 nike

本质上,我需要一个函数来克隆(即深度复制)具有一些共同属性的对象。 “公共(public)属性”本质上只是一个名为 op 的标签。进行操作。所以之前我使用 Flow 输入了一些代码:

export function cloneExpr<E: Expr>(exp: E): E {
if (exp.op === POINT) {
return ((expr.makePoint(exp.p, exp.x, exp.y):any):E);
} ... etc
}

哪里Expr是一堆东西的联合,比如 Point , Line等等,所有这些都有这个 op field 。强制转换有点难看,但至少它有效;即如果我 cloneExpr输入的对象 Point ,返回对象的类型为 Point无需我提供更多打字信息。

现在我想迁移到 Typescript,但我遇到了很多麻烦。硬铸return ((exp as any) as Point)在真空中工作,但我的类型保护不断丢失信息,所以例如我实际上无法获得字段 x从点exp没有失败的打字检查。为了让类型保护起作用,我尝试了多种函数类型变体,例如:

function cloneExpr<T extends Expr>(exp: T): T

哪里Expr就像Point | Line .

function cloneExpr<T extends IsExpr>(exp: T): T

哪里IsExpr是我用 op 定义的接口(interface)字段。

function cloneExpr(exp: Expr): Expr

我试过了,但显然我永远无法恢复正确的输入类型。

所以要么我没有得到类型保护,要么返回类型不是我输入的特定类型。我也尝试过使用接口(interface)重新定义对象,然后提供用户定义的类型保护,但无济于事。

在 Typescript 中执行此操作的正确方法是什么?非常感谢。

最佳答案

当您测试 exp.op == 时,未能将 expE 缩小到 Point(或类似的东西) = POINT 将由 this suggestion 寻址.同时,您可以通过将参数复制到 Expr 类型的局部变量来实现与 Flow 相同级别的类型安全:

export function cloneExpr<E extends Expr>(exp: E): E {
const exp1: Expr = exp;
if (exp1.op === POINT) {
return expr.makePoint(exp1.p, exp1.x, exp1.y) as any as E;
}
// ...
}

关于javascript - 在 Typescript 中克隆对象,从 Flow 迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52529089/

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