2014-01-14 27 views
8

Es ist möglich, void als Typparameter für generische Funktion in TypeScript anzugeben. Und es funktioniert gut für Rückgabewerte von Funktionen. Wenn jedoch void ein Typ eines Arguments ist, ist es nicht so klar, welcher Wert dafür verwendet werden kann. Gibt es eine Möglichkeit, einen Parameter für ein Argument vom Typ void anzugeben? Wenn nein, warum ist es möglich, eine solche Funktion zu deklarieren?void als Typ eines Arguments einer generischen Funktion in TypeScript

Antwort

0

Es stellte sich heraus, es ist sehr einfach, einen Wert von void zu erhalten. Obwohl technisch ist es immer noch der undefined Wert, aber Typoskript glaubt, dass es vom Typ Void, die genau das, was wir brauchen:

var voidValue = (function() { })(); 
7

Vom TypeScript specification:

HINWEIS: Wir betrachten könnte das Deklarieren von Variablen vom Typ Void disallowing, da sie keinen nützlichen Zweck dienen. Da Void jedoch als Typargument für einen generischen Typ oder eine generische Funktion zulässig ist, ist es nicht möglich, Void-Eigenschaften oder -Parameter zu verbieten.

4

Es ist möglich, void als ein Typargument zu verwenden, aber Sie sollten es nicht als einen Typ verwenden.

In der Tat, obwohl Sie in der Lage sein, kann es in einer Typanmerkung zur Zeit zu verwenden, ist es unmöglich, einen Wert zuzuweisen:

var x: void = ???; // cannot supply a value 

Die Verwendung von Leere als eine Art Argument ist unten dargestellt:

class Example<TReturn> { 
    process(func:() => TReturn) { 
     return func(); 
    } 
} 

Das Argument type in dieser Klasse wird verwendet, um den Rückgabetyp einer Funktion anzugeben. Das bedeutet, dass ich angeben möchte, dass die Funktion den Typ void hat. Also muss es als Typargument erlaubt sein.

var example = new Example<void>(); 

Nun, wenn ich den Anruf zu example.process schreiben, Auto-Vervollständigung wird mir sagen, dass das Argument, das ich Bedürfnisse passieren die folgende Art erfüllen:

func:() => void 

Und es wird mir auch sagen, dass example.process selbst ist ungültig in diesem Fall.

Die Absicht ist nicht für void jemals verwendet werden, um einen Typ zu kommentieren, aber da es gültige Gründe gibt, um es als ein Typargument zuzulassen, wird es derzeit nicht überprüft. Es bedeutet, dass Sie ungültige etwas schaffen können, aber Sie würden hart gedrückt werden, verwenden:

class Example<T> { 
    process(func: T) { 
     // if T is void, this is all wrong 
    } 
} 

var example = new Example<void>(); 

In diesem ungültigen Beispiel (die keine Fehler zeigen) Sie würde einen Anruf nicht in der Lage sein, zu schreiben, example.process, weil Sie kein gültiges Argument übergeben konnten.

+1

Tut mir leid. Können Sie mir den Teil Ihrer Frage markieren, den ich nicht beantwortet habe? – Fenton

0

Sie etwas tun können:

class Example<T> { 
    process(func: T = undefined) { 
    // use default undefined parameter 
    } 
} 

var example = new Example<void>(); 

exmple.process(); 

I Typoskript bin mit 1.8.7 und es funktionierte für mich gut.

Verwandte Themen