2017-05-19 2 views
2

Ich habe eine Schnittstelle finden, die aus der Methode cal() besteht; Klasse a1 und a2 implementiert die Schnittstelle. a1 gibt eine Zahl zurück, während a2 eine Zeichenfolge zurückgibt. Wie kann ich eine einzelne Schnittstelle definieren, um mein Problem zu lösen?Generische Typen Return in Typescript

Das Folgende ist mit dem Schnipsel von dem, was erwähnt wird.

interface Ifind { 
    cal() : string; 
} 

class a1 implements Ifind{ 

    public cal():string{ 
     return "10"; 
    } 
} 

class a2 implements Ifind{ 
    public cal(): number{ 
     return 12; 
    } 
} 

class main{ 
    private obj; 

    constructor() { 
     this.obj = new a1(); 
     var p = this.obj.cal(); 
     alert(p) 
    } 
} 

in TypeScript Playground

+1

Ändern Sie den Rückgabetyp von cal() in 'string | Nummer ". Aber ich würde lieber darüber nachdenken, warum Somind eine Zahl zurückgibt und andere eine Saite zurückgeben. Könnten nicht alle denselben Typ zurückgeben? –

Antwort

3

können Sie die Schnittstelle generic machen.

// Edited for naming 
interface Find<T> { 
    cal() : T; 
} 

class A1 implements Find<string> { 
    cal(): string { 
     return "10"; 
    } 
} 

class A2 implements Find<number> { 
    cal(): number { 
     return 12; 
    } 
} 

Ein paar Kommentare zum obigen Code.

TypeScript, als eine Obermenge von JavaScript, hat erstklassige Funktionen, die den obigen Code ziemlich hässlich und unidiomatisch macht.

Es wäre viel besser, einfach eine Funktion zu schreiben.

function a1() { 
    return "10"; 
} 

function a2() { 
    return 12; 
} 

Natürlich Ihr eigentlicher Code kann komplizierter sein, aber wenn Sie eine Schnittstelle mit nur einem Mitglied, und wenn das Mitglied eine Funktion ist, nur eine Funktion.

Ich habe auch den Code für Stil bearbeitet. Insbesondere sollten Typ- und Klassennamen PascalCased sein.

+1

Schöne Antwort. Nur eine Frage. Warum sollte die Schnittstelle nicht mit I vorangestellt werden? Haben Sie eine Reference, die das unterstützt? – Poku

+2

Eigentlich wurde dies früher von der https://typescriptlang.org -Dokumentation empfohlen, scheint aber entfernt worden zu sein. Es ist der [Stil gefolgt vom TypeScript-Team für _internal_ use] (https://github.com/Microsoft/TypeScript/wiki/Coding-guidelines#names), aber das ist nicht als Vorgabe für die Konsumenten der Sprache gedacht. Ich würde sagen, es ist nicht unbedingt eine schlechte Praxis, nur nicht sehr häufig. Ich würde meine Antwort anpassen. –

+0

Danke für die Referenz. Interessant warum sie das entschieden haben. Schließlich haben sie auch C#, wo Präfix-Schnittstellen mit I gute Praxis ist. – Poku