我有一个汽车品牌列表,我有一家汽车制造厂,可以乘用汽车和一个根据品牌而不同的选择对象。
type CarBrand = 'mazda' | 'toyota' | 'hyundai';
export function CarFactory(car: 'mazda', options: { a: string; b: string }): object;
export function CarFactory(car: 'toyota', options: { b: string; c: string; d: string }): object;
export function CarFactory(car: 'hyundai', options: { e: string; f: string; g: number }): object;
export function CarFactory(car: CarBrand, options: any): object {
return options;
}
此功能目前对我有用,但是如果将来我有更多的汽车品牌,那么添加新的类型签名以使功能过载将非常费力。有更有效的方法吗?
答案 0 :(得分:1)
我倾向于创建一个界面,以表示从品牌名称到选项的映射,然后使您的CarFactory
函数generic生效。像这样:
interface CarBrandOptions {
mazda: { a: string; b: string };
toyota: { b: string; c: string; d: string };
hyundai: { e: string; f: string; g: number };
}
type CarBrand = keyof CarBrandOptions;
function CarFactory<K extends CarBrand>(car: K, options: CarBrandOptions[K]): object {
return options;
}
我认为这与您当前代码的行为相同:
CarFactory("mazda", { a: "", b: "" }); // okay
CarFactory("toyota", { a: "", b: "" }); // error!
// Argument of type '{ a: string; b: string; }'
// is not assignable to parameter of type '{ b: string; c: string; d: string; }'.
CarFactory("toyota", { b: "", c: "", d: "" }); //okay
,但是通过向CarBrandOptions
界面中添加属性或将属性合并到{{1}}界面中,可以更轻松地添加更多汽车品牌。好的,希望能有所帮助;祝你好运!