javascript - Hur kan jag hantera anropet av en funktion med två objekt som implementerar olika gränssnitt i typescript?
Jag har följande gränssnitt:
interface Ixy
{
X: string;
Y: string;
}
interface Ixz
{
X: string;
Z: string;
}
Den här funktionen:
export function update(json: Ixy) {
var a = json.X;
}
Funktionen anropas från följande två ställen:
export function update1(json: Ixy) {
update(json);
}
export function update2(json: Ixz) {
update(json);
}
Kan någon förklara för mig det bästa sättet jag kan få detta att fungera med TypeScript. Just nu är update1 okej men update2 visar att signaturen inte stämmer. Är det enda sättet jag kan fixa detta att ändra typen av json till any eller finns det ett bättre sätt att göra detta?
Svar #1
Det finns ett par sätt att göra det. Förmodligen är det bästa att skapa ett basgränssnitt Ixx som har den gemensamma egenskapen X, sedan utöka det för att skapa Ixy och Ixz, och sedan implementera update med Ixx som parametertyp:
interface Ixx
{
X: string;
}
interface Ixy extends Ixx
{
Y: string;
}
interface Ixz extends Ixx
{
Z: string;
}
export function update(json: Ixx) {
var a = json.X;
}
export function update1(json: Ixy) {
update(json);
}
export function update2(json: Ixz) {
update(json);
}
Detta fungerar eftersom Ixy och Ixz båda utökar Ixx och skulle därför uppfylla villkoret json is Ixx. Detta fungerar även med klasser som utökar en basklass (eller klasser som utökar ett basklassgränssnitt).
Det finns inte mycket litteratur om TypeScript än, så kanske några allmänna introduktioner till gränssnitt från andra språk kan vara användbara, eftersom detta egentligen är en tvärspråklig fråga om användning av gränssnitt, snarare än något specifikt för TS.
Java-gränssnitt: http://docs.oracle.com/javase/tutorial/java/IandI/createinterface.html
C# gränssnitt: http://www.codeproject.com/Articles/18743/Interfaces-in-C-For-Beginners
