Я сталкиваюсь со сценарием, в котором ответ HTTP-вызова зависит от региона.Я должен указать тип возвращаемого объекта.Поэтому, если я объявляю предположим 4 типа и использую их объединение в качестве типа оболочки.
Проблема возникает, поскольку существуют поля, которые не являются общими для всех.Разве решение этого состоит в том, чтобы сделать эти поля необязательными.Для меня сделать поле необязательным означает, что это не обязательно, что в данном случае неверно.Как это сделать, чтобы ошибка Tslint исчезла.
Пожалуйста, скажите мне, если вы не понимаете мой вопрос
РЕДАКТИРОВАТЬ: -
function mapAddress(address: AddressRegionXX | AddressRegionYY,region:string): AddressWithIdXX | AddressWithIdXX {
let addressId = address.id ? address.id : "XX";
let addressType = addressId == "XX" ? "subbed" : "unsubbed";
if(region == "XX"){
return {
firstName: address.first_name || null,
lastName: address.last_name || null,
street1: address.addr_1 || null,
street2: address.addr_2 || null,
city: address.city || null,
state: address.state || null,
postalCode: address.zip_code || null,
phone: address.phone_number || null,
addressId: addressId,
addressType: addressType
};
if(region == "XX"){
return {
fName: address.f_name || null,
lName: address.l_name || null,
address: address.addr_1 || null,
roomNo: address.addr_2 || null,
district: address.district|| null,
state: address.state || null,
pinCode: address.zip_code || null,
phoneNumber: address.phone_number || null,
addressId: addressId,
addressType: addressType
};
}
}
Это контекстгде я должен использовать тип объединения. Здесь будет меняться ответ в зависимости от типа адреса каждого региона, имеется длинный список, который нецелесообразно включать здесь.Как я показал здесь, имена полей различаются для каждого региона и для некоторых дополнительных полей есть.Итак, что является элегантным способом решения этой ситуации, так это уместно использовать условные типы.Есть ли альтернатива союзному типу?Как и в ened, в будущем будет как минимум 5-6 типов адресов и шансов на большее.
In layman terms
is there any miraculous way in which :D
We write something Like
type correctTypeAddress<T> =
T extends Address? AddressXX :
T extends Address? AddressYY :
mapAddress (address: AddressRegion, region: string): correctTypeAddress
Ниже приведенПример того, что я имею дело со всеми типами, не имеет одинаковых свойств.Итак, как бороться с неравномерным отображением типов Есть ли альтернатива использованию объединенного типа, когда
Способ воссоздания проблемы
type typeA = {
prop1:string;
prop2:string;
}
type typeB = {
prop1: string;
prop3: string;
}
type typeC = {
prop4: string;
prop5: string;
}
type mappedType = typeA | typeB | typeC;
const a = (b): mappedType => {
return {
prop1:"1",
prop5:"3"
}
}
РЕДАКТИРОВАТЬ: - Применение условных типов, но использование универсальных приводит к другой ошибке lint как Property 'prop1' does not exist on type 'T'
type typeIA = {
prop1: string;
prop2: string;
}
type typeIB = {
prop1: string;
prop3: string;
}
type typeIC = {
prop4: string;
prop5: string;
}
type typeOA = {
prop1: string;
prop2: string;
}
type typeOB = {
prop1: string;
prop3: string;
}
type typeOC = {
prop4: string;
prop5: string;
}
// type mappedType = typeA | typeB | typeC;
const a = <T extends typeIA | typeIB | typeIC>(_b: T): T extends typeIA ? typeOA : never | T extends typeIB ? typeOB : never | T extends typeIC ? typeOC : never=> {
if (_b.prop1 == "1"){
return {
prop1: "1",
prop3: "3"
} as T extends typeIA ? typeOA : never | T extends typeIB ? typeOB : never | T extends typeIC ? typeOC : never
}else{
return {
prop1: "1",
prop2: "2"
} as T extends typeIA ? typeOA : never | T extends typeIB ? typeOB : never | T extends typeIC ? typeOC : never
}
}
const c = a({prop1:"1",prop2:"2"});
const d = a({ prop1: "1", prop3: "2" });
const e = a({ prop4: "1", prop5: "2" });