如何使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
相关产品推荐
相关产品推荐

