gpt4 book ai didi

javascript - 如果对象函数存在于 TypeScript 中,则调用它

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

我正在 Typescript 中实现一个二叉搜索树类作为学习该语言的练习,我正在尝试使用 generics 实现它。

在我目前实现的类的算法中,我需要对我正在处理的任何对象执行两个逻辑操作:检查它们是否相等,并检查一个是否大于另一个.这在操作像 number 这样的基本类型时很容易,因为我可以只使用运算符 ===> 来比较对象,但是作为我想制作一个通用类,这里的事情开始变得复杂。

为了实现这一点,我想出了这个“解决方案”,其中用户的对象需要定义两个方法:equalsgreaterThan。基于此,我为树的节点创建了这段代码:

class TreeNode<T> {
/* A node used in the tree. */
data: T;
left: TreeNode<T> | undefined;
right: TreeNode<T> | undefined;

constructor(data: T) {
this.data = data;
this.left = undefined;
this.right = undefined;
}

equals(obj: TreeNode<T>): boolean {
/* Checks whether an equals function exists in the object. If it doesnt,
tries to use === operator to perform equality check instead. */

if ('equals' in obj.data)
return <boolean>this.data.equals(obj.data);
else
return this.data === obj.data;
}

greaterThan(obj: TreeNode<T>): boolean {
/* Checks whether an greaterThan function exists in the object. If it doesnt,
tries to use > operator to check if this.data is greater than obj.data */

if ('greaterThan' in obj.data)
return <boolean>this.data.greaterThan(obj.data);
else
return this.data > obj.data;
}
}

如您所见,我的代码旨在比较节点(TreeNode 的函数 equalsgreaterThan 将被调用BinarySearchTree 类,我没有在这里包含它),并且在比较节点时,它会检查提到的方法是否在用户对象中定义,存储在 data 属性。如果是,我将使用它们进行比较。如果不是,我会假设对象是一个数字,而不是使用关系运算符。对我的解决方案很满意,我尝试编译代码,结果出现以下错误:

TS2339: Property 'equals' does not exist on type 'T'.

TS2339: Property 'greaterThan' does not exist on type 'T'.

因此,即使我检查了这些方法是否存在,编译器还是拒绝编译代码。我该如何解决?

最佳答案

您可以为 T 定义一个类型约束,并将两个成员设为可选:

class TreeNode<T extends { equals?(o: T): boolean; greaterThan?(o: T): boolean }> {
/* A node used in the tree. */
data: T;
left: TreeNode<T> | undefined;
right: TreeNode<T> | undefined;

constructor(data: T) {
this.data = data;
this.left = undefined;
this.right = undefined;
}

equals(obj: TreeNode<T>): boolean {
/* Checks whether an equals function exists in the object. If it doesnt,
tries to use === operator to perform equality check instead. */

if (this.data.equals)
return <boolean>this.data.equals(obj.data);
else
return this.data === obj.data;
}

greaterThan(obj: TreeNode<T>): boolean {
/* Checks whether an greaterThan function exists in the object. If it doesnt,
tries to use > operator to check if this.data is greater than obj.data */

if (this.data.greaterThan)
return <boolean>this.data.greaterThan(obj.data);
else
return this.data > obj.data;
}
}

关于javascript - 如果对象函数存在于 TypeScript 中,则调用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49158489/

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