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

无需空接口,如何实现TypeScript求和类型风格且免修改统一文件的功能?

解决方案:通过模块声明合并自动收集Food类型

要解决新增类型无需修改Aux.ts且避免空接口无效的问题,可以用模块声明合并结合唯一标识字段的方式,让每个Food类型自动加入联合类型,同时保证类型安全。

具体实现步骤

1. 定义基础Food类型文件

创建types/Food.ts作为Food类型的入口,初始化为never(空联合类型):

// types/Food.ts
export type Food = never;

2. 在各子类型文件中扩展Food类型

每个自定义类型文件(比如Ham.ts、Cheese.ts)中,通过模块声明合并将自身类型加入Food联合,同时添加唯一字面量标识避免结构冲突:

// Ham.ts
import type { Food } from './types/Food';

// 声明合并扩展Food类型
declare module './types/Food' {
  export type Food = Food | Ham;
}

export interface Ham {
  type: 'ham'; // 唯一标识,确保结构唯一性
  a: string;
}
// Cheese.ts
import type { Food } from './types/Food';

declare module './types/Food' {
  export type Food = Food | Cheese;
}

export interface Cheese {
  type: 'cheese';
  b: string;
}

3. 在Aux.ts中使用Food类型

直接导入合并后的Food类型,函数无需修改即可支持所有新增的Food类型:

// Aux.ts
import type { Food } from './types/Food';

const onlyFood = (arg: Food) => {
  console.log("executed onlyFood");
};

新增类型的操作

当需要添加新的Food类型(比如Bread.ts)时,只需创建对应文件并重复上述扩展步骤,完全不需要修改Food.ts或Aux.ts:

// Bread.ts
import type { Food } from './types/Food';

declare module './types/Food' {
  export type Food = Food | Bread;
}

export interface Bread {
  type: 'bread';
  c: string;
}

方案优势

  • 无需修改核心文件:新增类型时仅需维护自身文件,不影响Aux.ts和基础类型文件。
  • 类型安全:唯一字面量标识避免了空接口导致的结构类型混淆问题,非Food类型无法赋值给Food参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 20:40:29