2017-06-05 3 views
1
function myFunc(id: string) { 
    id = "("; 
}; 

let id: string = ")"; 
if (id !== '(') 
    throw "Expected '(' in prototype"; 

myFunc(id); 

if (id !== ')') 
    throw "Expected ')' in prototype"; 

Wenn ich die Änderung inline dann kann ich nicht den Fehler unterFehler TS2365: ‚! ==‘ Operator kann nicht auf Typen angewendet werden ‚("‘und‚‚)‘‘

error TS2365: Operator '!==' cannot be applied to types '"("' and '")"'. 

Der Inhalt des Vergleichs ist egal. Eine beliebige Zeichenfolge a, basdasd, cqwe usw. kann anstelle von (und)

+2

Können Sie beschreiben, was Sie hier erreichen möchten? – toskv

+1

Vielleicht off-topic: Beachten Sie, dass das ID-Argument in 'myFunc' die ID-Variable außerhalb von' myFunc' überschattet. Als Ergebnis verändert 'myFunc' den Wert der 'globalen'' id' Variablen nicht, daher hat das Aufrufen keinen Effekt. –

+0

Der Fehler bleibt auch nach der Behebung bestehen. Ich denke, es ist ein Fehler oder Einschränkungen mit Typskript Typ Verengung und Erweiterung. Der Nebeneffekt von "id", der in "myFunc" definiert ist, sollte "id" auf "string" erweitern, aber das ist eindeutig nicht der Fall. –

Antwort

0

verwendet werden. Was passiert, ist Typverschmälerung. Nach dem Übergeben der ersten if-Anweisung wird der Typ id auf String-Literal ")" eingeschränkt, weil andernfalls die Ausnahme ausgelöst worden wäre.

function myFunc(id: string) { 
    id = "("; 
}; 
// Note that this function does nothing, but it's not the issue here 

let id: string = ")"; 

if (id !== '(') 
    throw "Expected '(' in prototype"; 
// id is narrowed to "(" 

myFunc(id); 

// now id and ')' does not have same type, hence the error 
if (id !== ')') 
    throw "Expected ')' in prototype"; 
+0

Vielen Dank. Wie definiere ich eine Instanz/Variable, in der ich verschiedene Arten von Strings halten möchte? z.B. Wenn ich beim Analysieren Token von einem Array überspiele? –

+0

Sie können den Union-Typ verwenden, z. B. type t = "(" | ")" ' –

Verwandte Themen