javascript - Typescript: Hur man kontrollerar interfacets typ
Jag har en metod getUniqueId som accepterar två typer av interface nedan, som kommer att returnera uniqueId beroende på vilken typ av interface som skickas:
interface ReadOnlyInfo {
itemId: string;
....
}
interface EditInfo {
formId: number;
....
}
function getUniqueId (info: ReadOnlyInfo | EditInfo) {
if (info instanceof ReadOnlyInfo) {
return info.itemId;
}
return info.formId;
}
Jag undrar om det är en bra praxis att använda instanceof här. Min oro är att jag kan ha många andra metoder som liknar getUniqueId, som också accepterar typen "ReadOnlyInfo | EditInfo", så jag måste upprepa "ReadOnlyInfo | EditInfo" överallt.
Istället för att göra det, försökte jag också använda typ:
type CommonInfo = | ReadOnlyInfo | EditInfo;
så att jag kan spara lite kod (gör bara CommondInfo), som nedan, men på det sättet kan jag inte säga vilken typ CommonInfo är, instanceof fungerar inte längre och ger mig kompileringsfel.
function getUniqueId (info: CommonInfo) {
if (info instanceof ReadOnlyInfo) {
return info.itemId;
}
return info.formId;
}
Så, jag undrar vad som skulle vara bästa praxis för att designa gränssnitt/metoder i detta scenario. Tack på förhand!
Svar #1
Gränssnitt i Typescript är bara syntaktiskt socker för ditt IDE. Det är inte möjligt att kontrollera gränssnittstyper som i andra språk. Att veta i C# till exempel.
Men med typvakt kan du känna igen vilken gränssnitt som används.
interface ReadOnlyInfo {
itemId: string;
....
}
interface EditInfo {
formId: number;
....
}
function getUniqueId (info: ReadOnlyInfo | EditInfo) {
if (isReadOnlyInfo(info)) return info.itemId;
if (isEditInfo(info)) return info.formId;
}
function isReadOnlyInfo(item: any): item is ReadOnlyInfo {
return 'itemId' in item;
}
function isEditInfo(item: any): item is EditInfo {
return 'formId' in item;
}
På detta sätt får du ett bättre IDE-stöd
