angular - Kan jag ärva ett gränssnitt till ett annat i typescript? Hur kan jag komma åt egenskapen som definieras i det ärvda gränssnittet?
Två gränssnitt finns, det första är ICat och det andra är IMammal. IMammal utökar ICat. Kommer Cat-egenskapen i IMammal att ha möjlighet att komma åt alla egenskaper i ICat-gränssnittet?
export interface ICat {
Cateye: string[];
Color: string;
Name: string;
}
export interface IMammal extends ICat {
Description: string;
HasImage: boolean;
CatGroup: string[];
**Cat: ICat[]**;
}
Grundläggande, hur kan jag uppnå flera interface-arv i Typescript?
Svar #1
Jag tror kanske att ICat borde utöka IMammal eftersom Cat är ett Mammal, och en Mammal behöver inga referenser till ICat, tänk om du vill lägga till IDog en dag:
export interface IMammal {
Description: string;
HasImage: boolean;
}
export interface ICat extends IMammal {
Cateye: string[];
CatGroup: string[];
Color: string;
Name: string;
}
class Cat implements ICat {
Cateye: string[];
Color: string;
Name: string;
Description: string;
HasImage: boolean;
CatGroup: string[];
}
const pusur:ICat = new Cat();
pusur.Name = "Pusur";
pusur.Description = "Likes lasagna";
pusur.CatGroup = ["Cartoon cat"];
Svar #2
Du använder implements för gränssnitt, använd extends för klassarv. implements gör att du kan ange en lista över gränssnitt som implementeras av klassen.
Observera att det ganska ofta inte spelar någon roll, eftersom en klass som implementerar alla egenskaper och metoder i ett gränssnitt automatiskt är kompatibel med gränssnittet oavsett om den uttryckligen implementerar gränssnittet eller inte, men att lista gränssnitten uttryckligen innebär åtminstone att kompilatorn kommer att tala om för dig om du misslyckats med att implementera dem korrekt.
interface A {
a: string;
}
interface B {
b: string;
}
class Foo implements A,B {
a: string;
b: string;
}
function foo(b: B) {}
function bar(a: A) {}
const f = new Foo();
foo(f);
bar(f);
