如何键入需要返回对象副本同时还更改其属性之一的类型的函数?

Posted

技术标签:

【中文标题】如何键入需要返回对象副本同时还更改其属性之一的类型的函数?【英文标题】:How to type a function that needs to return a copy of an object while also changing the type of one of its properties? 【发布时间】:2021-01-20 05:10:04 【问题描述】:

我想用以下代码完成什么:

Playground link

interface SOME_OBJECT_DATE    otherProp: boolean,  myDate: Date 
interface SOME_OBJECT_STRING  otherProp: boolean,  myDate: string 

function convertDateToString(obj: SOME_OBJECT_DATE): SOME_OBJECT_STRING 
    const newObj = ...obj as SOME_OBJECT_STRING;
    newObj.myDate = obj.myDate.toJSON();
    return newObj;

此函数的主要目标是将myDate 属性的类型从Date 转换为string。但我需要复制对象的其余部分,即:otherProp 属性。

如何更新myDate,复制obj参数并返回正确的类型?

这是我得到的错误:

注意:在我的真实场景中,我还有一些其他重载(即:我将使用扩展“基础”interface myDate: Date 的多种类型来调用它,因此我制作了一个我将调用它的重载列表有,但我需要键入实现,它应该类似于上面的示例。

【问题讨论】:

【参考方案1】:

您可以轻松地构造所需类型的对象,而无需键入错误的帮助器。

使用错误类型的帮助器对象并安抚编译器是一种技术,如果您知道您将更正类型以匹配其广告接口,但在您发布的示例中没有必要诉诸此类技巧。

function convertDateToString(obj: SOME_OBJECT_DATE): SOME_OBJECT_STRING 
  return 
    ...obj,
   myDate: obj.myDate.toJSON()
  ;

Playground link

【讨论】:

感谢您的回答,@Lesiak。很抱歉造成混乱。我已经更新了示例并忘记更改函数的名称。现在会修复它。我明白我做错了什么。我试图用“两步”构建新对象,而不是一次完成。

以上是关于如何键入需要返回对象副本同时还更改其属性之一的类型的函数?的主要内容,如果未能解决你的问题,请参考以下文章

TypeScript 条件类型和计算对象属性名称

如何修改查询集并将其保存为新对象?

如何告诉(托管)对象通知其 KVO 需要重新缓存其属性之一?

创建任何对象的只读/不可变副本(包括深层属性)

Struts类型转换

条件运算符从其参数的副本返回值