打字稿:如何从另一个界面合并对象?



我有以下接口:

interface TxInterface {
field1: string;
field2: string;
field3: number;
}
interface RxInterface {
field1: string;
field2: string;
field3: number;
field4: string;
field5: string;
}

当我从服务器接收到一个对象时,它是用 RxInterface 键入的。例如,在我的应用程序中,当我更新值时,我会继续使用此对象。

当我想更新服务器中的对象时,我将发送"TxInterface",其中包含"RxInterface"的一些字段。

那么,如何在发送之前轻松地将我的对象从 RxInterface 合并到 TxInterface 并仅获取 TxInterface 的字段?

仅使用接口定义是无法做到这一点的,因为此类定义是被运行时擦除的类型系统的一部分。 如果您需要在运行时完成某些操作,则需要编写在运行时完成的代码。 在本例中,下面是一个泛型函数,它仅提取与键列表匹配的对象的属性:

function extract<T extends object, K extends keyof T>(
obj: T,
keys: K[]
): Pick<T, K> {
const ret = {} as Pick<T, K>;
keys.forEach(k => ret[k] = obj[k])
return ret;
}

对于您的特定用例,您可以创建一个转换函数,其类型涉及RxInterfaceTxInterface,但它将您关心的特定键指定为值而不是类型:

const rxToTx = (rx: RxInterface): TxInterface => // type annotation here
extract(rx, ["field1", "field2", "field3"]); // explicit key values here

您可以验证它是否有效:

const rx: RxInterface = {
field1: "yes",
field2: "yep",
field3: 100,
field4: "no",
field5: "nope"
}
const tx = rxToTx(rx);
console.log(tx);
// {field1: "yes", field2: "yep", field3: 100}

希望有帮助;祝你好运!

好的。这是引入二进制操作(也称为"归约")的良好起点。

考虑通用函数签名:T -> T -> T。它的作用是将两个相同类型的参数T并以某种方式将它们"折叠"为相同类型的单个结果实例T。举个简单的例子,在numbers 上取+或在strings 上串联。

事实证明,这种二进制操作在数学的各个分支中非常普遍,并且建立在更可靠的原因之上,而不仅仅是编程的便利性。例如,"半群"本质上是相同的二进制操作,几乎没有额外的属性,我不会在这里解释。

所以,不要忽视它。而是以这样一种方式设计代码,以便您可以利用上述(通用)签名的二进制操作。问题是:如何?映射!您是否听说过"映射/减少"方法?这正是您要实现的:首先将不可约化实例映射到可约化实例,然后应用您拥有的归约实例之一以计算最终结果。

附言在你的例子中,映射是微不足道的:只需指定显式的通用参数,因为更宽的接口也满足较窄的接口。

相关内容

最新更新