2017-11-06 2 views
0

Kurz Beispiel der Frage, die ich etwa in Typoskript fragen wollen:Typdeklaration ist nicht zwingend in Typoskript Generika

export class Test { 
    public runTest<T>(param: T): T { 
     return param; 
    } 
} 

let test1: Test = new Test(); 
test1.runTest<string>("string1"); 
test1.runTest("5555"); 

Both „runTest“ Aussagen normalerweise ausgeführt werden. Zuerst müssen Sie eine Zeichenfolge übergeben (was großartig ist), zweitens nicht wirklich. Aber ich möchte es für jeden obligatorisch machen, der "runTest" benutzt, um irgendeinen Typ in T zu übergeben.

Kann es getan werden? Ich kann mir keinen Weg über Code einfallen lassen. Habe auch versucht nach TSLint-Regel zu suchen, die helfen könnte, fand aber auch keine.

Dank

+0

Warum obligatorisch? So funktioniert TypeScript nicht. "T" wird als "String" bezeichnet. Typinferenz ist eines der grundlegenden Merkmale von TypeScript. – cartant

+0

Allgemeine Idee ist, dass Leute immer den Typ angeben, den sie in Methode übergeben. Vorherige Version war wie runTest (param: any). Ich möchte wirklich immer wie runTest geschrieben werden (Nachricht) wo die Nachricht von IMessage ist. – North

Antwort

2

Wenn Sie dies wollen, bekommen getan wirklich (ich werde keine Sorgen über warum Sie tun dies), müssen Sie Typoskript überzeugen, für T, wenn Sie eine schlechte Art zu schließen, lassen Sie es aus, damit es den Test nicht durchführt. Ich kann nicht herausfinden, wie es direkt zu tun, aber hier ist eine indirekte Art und Weise:

export class Test { 
    public runTestIndirectly<T = never>(): (t:T)=>T { 
     return (t:T)=>t 
    } 
} 

So runTestIndirectly()produziert eine Funktion, die wie runTest verhält. Der Typ T wird abgeleitet, wenn Sie runTestIndirectly() aufrufen, die keinen Zugriff auf den Objekttyp hat, den Sie an die von ihr erzeugte Funktion übergeben. Und wenn Sie T Standard never haben, werden Sie einen Fehler erhalten, wenn Sie vernachlässigen T, um etwas zu geben, das funktioniert:

let test1: Test = new Test();   
test1.runTestIndirectly<string>()("string1"); // works 
test1.runTestIndirectly()("5555"); // fails: 
// Argument of type '"5555"' is not assignable to parameter of type 'never'. 

Hoffnung, das hilft!

Verwandte Themen