Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TypeScript:如何从另一个接口合并对象?_Typescript_Interface - Fatal编程技术网

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}