You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript无需接口/类型,动态添加对象属性的最优实现

问题描述

我希望在TypeScript中为已存在的对象分配新属性,但不想定义接口或类型。目前遇到如下类型错误:

Property 'completion_date' does not exist on type '{ course_status: string; completion_percentage: string; }'.

我的代码如下:

const courseCompletionStatus = (completionPercentage: string) => {
  
  const courseStatus = {
    course_status: 'in progress',
    completion_percentage: completionPercentage
  }
    if (completionPercentage === '100%') courseStatus.completion_date = new Date().setUTCHours(0, 0, 0, 0).toString()

  return courseStatus
  
}

请问当completion_percentage等于'100%'时,如何最优地创建并分配该属性值?我仅希望在该条件满足时包含completion_date属性。


解决方案

以下是几种无需定义额外接口或类型的最优实现方式:

方法一:条件扩展对象(推荐)

直接在返回阶段根据条件合并对象,TypeScript会自动推导正确的联合类型,兼顾类型安全和代码简洁:

const courseCompletionStatus = (completionPercentage: string) => {
  const baseStatus = {
    course_status: 'in progress',
    completion_percentage: completionPercentage
  };

  return completionPercentage === '100%' 
    ? { ...baseStatus, completion_date: new Date().setUTCHours(0, 0, 0, 0).toString() }
    : baseStatus;
}

这种方式让TypeScript明确识别返回值是包含completion_date或不包含的联合类型,调用方也能获得准确的类型提示。

方法二:临时类型断言放宽限制

如果需要在原对象上直接添加属性,可以用类型断言将对象转为Record<string, unknown>或any:

const courseCompletionStatus = (completionPercentage: string) => {
  const courseStatus: Record<string, unknown> = {
    course_status: 'in progress',
    completion_percentage: completionPercentage
  };

  if (completionPercentage === '100%') {
    courseStatus.completion_date = new Date().setUTCHours(0, 0, 0, 0).toString();
  }

  return courseStatus;
}

注意:这种方式会弱化类型检查,仅适合临时场景,不推荐作为长期方案。

方法三:内联可选属性类型

在变量声明时直接书写包含可选属性的类型字面量,无需单独定义接口:

const courseCompletionStatus = (completionPercentage: string) => {
  const courseStatus: {
    course_status: string;
    completion_percentage: string;
    completion_date?: string;
  } = {
    course_status: 'in progress',
    completion_percentage: completionPercentage
  };

  if (completionPercentage === '100%') {
    courseStatus.completion_date = new Date().setUTCHours(0, 0, 0, 0).toString();
  }

  return courseStatus;
}

这种方式保留了完整的类型检查,同时避免了额外的接口定义。


内容的提问来源于stack exchange,提问作者HelloWorld

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 18:42:32