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

如何使TypeScript接口方法的参数直接遵循另一接口属性类型?

复用接口定义TypeScript方法参数且无需包裹对象

要通过IShippingAddressParams定义setShippingAddress的参数类型,同时避免传递包裹对象,只需让IShippingAddressParams直接对应IAddress的结构即可。以下两种方案都能满足需求:

方案一:接口继承

通过让参数接口继承IAddress,复用其结构定义参数类型:

interface IAddress {
  name: string;
  addressLine1: string;
  addressLine2: string;
  landmark: string;
  city: string;
  state: string;
  pincode: number;
}

// 继承IAddress,使参数接口与地址结构完全一致
interface IShippingAddressParams extends IAddress {}

interface IOrderBuilder {
  setCustomer({ customerId }: { customerId: string; }): Order;
  // ...其他方法
  
  // 用IShippingAddressParams定义参数类型
  setShippingAddress(address: IShippingAddressParams): Order;

  // ...其他方法
}

// 实现时直接传入IAddress类型参数,符合预期
class OrderBuilder implements IOrderBuilder {
  setCustomer({ customerId }: { customerId: string; }): Order {
    // 业务逻辑实现
    return {} as Order;
  }

  setShippingAddress(address: IAddress): Order {
    // 业务逻辑实现
    return {} as Order;
  }
}

方案二:类型别名

用类型别名直接关联IAddress,作为参数类型的定义载体:

interface IAddress {
  name: string;
  addressLine1: string;
  addressLine2: string;
  landmark: string;
  city: string;
  state: string;
  pincode: number;
}

// 类型别名直接指向IAddress,作为参数类型定义
type IShippingAddressParams = IAddress;

interface IOrderBuilder {
  setCustomer({ customerId }: { customerId: string; }): Order;
  // ...其他方法
  
  setShippingAddress(address: IShippingAddressParams): Order;

  // ...其他方法
}

// 实现方式完全符合需求
class OrderBuilder implements IOrderBuilder {
  setCustomer({ customerId }: { customerId: string; }): Order {
    return {} as Order;
  }

  setShippingAddress(address: IAddress): Order {
    return {} as Order;
  }
}

原理说明

TypeScript采用结构类型系统,只要两个类型的结构匹配就会被视为兼容。通过上述两种方式让IShippingAddressParams与IAddress结构对齐,既满足了用独立接口/类型定义参数的要求,又不需要额外包裹对象,实现时直接传入IAddress类型参数即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 11:37:06