TypeScript:如何从另一个接口合并对象?
我有以下接口:TypeScript:如何从另一个接口合并对象?,typescript,interface,Typescript,Interface,我有以下接口: interface TxInterface { field1: string; field2: string; field3: number; } interface RxInterface { field1: string; field2: string; field3: number; field4: string; field5: string; } 当我从服务器接收到一个对象时,它是用RxInterfac
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的字段?好的。引入二进制操作(也称为“归约”)是一个很好的起点 考虑通用函数签名:
T->T->T
。它所做的是获取相同类型的两个参数T
,并以某种方式将它们“折叠”为相同类型的单个结果实例T
。作为一个简单的例子,以number
s上的+
或字符串上的串联为例
事实证明,这样的二进制运算在数学的各个分支中都是非常普遍的,而且基于一个比编程更可靠的原因。例如,“”本质上是相同的二进制操作,没有多少附加属性,我在这里不作解释
所以,不要忽视它。相反,您的代码设计应该能够利用上述(通用)签名的二进制操作。问题是:怎么做?映射!你听说过“映射/减少”方法吗?这正是您将要实现的:首先将一个不可还原的实例映射为一个可还原的实例,然后应用其中一个约简来计算最终结果
注意:在您的例子中,映射因为很简单:只需显式指定泛型参数,因为更宽的接口也可以满足更窄的接口。仅使用接口定义无法做到这一点,因为此类定义是运行时使用的类型系统的一部分。如果您需要在运行时完成某项工作,则需要编写在运行时完成该工作的代码。在本例中,有一个通用函数,它只提取与键列表匹配的对象的属性:
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;
}
您可以验证它是否有效:
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}
希望有帮助;祝你好运 你能澄清最后一部分吗?如果您只需要将TxInterface字段发送到服务器,那么它将不会是一个合并,更像是将较大的对象缩减为较小的对象。解决方案的可能重复项的可能重复项起作用,但会发出警告,我找不到解决方案。标题警告是“参数类型[string,string,string]不可分配给参数类型keyt[]”。我和PhpStorm合作,我不能复制你的问题。如果您使用的是TS3.4+,您可以尝试将[“field1”、“field2”、“field3”]作为const
,但我认为它应该按照说明工作。你有没有一种方法可以证明你的问题?如果我不能复制它,就很难给出建议。我在Angular 7应用程序中使用TS3.2。最简单的例子可以是“创建Angular 7项目”,然后“在app.component.ts中添加代码片段”我没有PhpStorm,因此除非你的示例可以通过链接到某个web IDE(如或)进行复制,否则我认为我在这里帮不了什么忙。如果您怀疑您的问题是特定于PhpStorm的,您应该将该标记添加到您的问题中。。。(可能是一个新问题,因为我怀疑如果你只是编辑它,你会不会对这个问题有太多关注)
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}