2016-10-26 5 views
2

Was ist das erwartete Verhalten, wenn "this" innerhalb einer Funktion in einem Objektliteral verwendet?Typescript Objektliteral "this" Schlüsselwort

Zum Beispiel, ich habe einen Typ foo, der nur eine Funktion namens "bar" hat und keine andere Eigenschaft darauf. Aber in der fooObj.bar-Methode kann ich auf this.baz zugreifen (wobei "baz" keine Eigenschaft vom Typ "foo" ist). Ich sehe keinen Fehler. Sollte man den Fehler nicht ausschreiben, da fooObj nicht "baz" drauf hat?

+0

Haben Sie versucht, Einstellung ' "noImplicitThis": true' Compiler-Option? –

Antwort

3

Sie verwenden eine Pfeilfunktion, which has lexical this.

Die Abkürzung für eine nicht-Pfeil-Funktion Eigenschaft in einem wörtlichen Objekt ist noch kürzer, aber:

var fooObj: foo = { 
    bar() { 
     console.log(this.baz); 
    } 
} 
+0

Die Frage bleibt: Was ist 'baz' und warum sagt Ihnen TypeScript nicht, dass' foo' (was wohl der Typ von 'this' ist, denke ich) keine' baz' Eigenschaft hat? Ich bin nicht besonders gut über TypeScript informiert, aber ist das nicht der ganze Punkt, den Ihre Typen benötigen, um ihre Eigenschaften explizit zu definieren? Ich denke, die Frage ist, warum ist 'this' vom Typ' any' innerhalb einer lexikalisch gebundenen Funktion und nicht vom Typ 'foo'? – meagar

+1

@meagar: 'foo' sollte nicht die Art von' this' sein. 'this' ist was auch immer' this' war in der Funktion, die das Objektliteral enthält. – Ryan

+0

Ah, ja. Ich beschönige die Tatsache, dass wir nicht in einer ES6-Klassenerklärung sind. Warum schaut TypeScript dann nicht auf den Kontext der Objekt-Literal-Deklaration und stellt fest, dass der Typ "this" immer noch keine "baz" -Eigenschaft hat? – meagar

2

Sie Typoskript fragen zu folgern, dass thisfooObj ist.

Typescript bindet this durch Erstellen einer lokalen Variablen _this, die an den this -kontext gebunden ist, wo der Fettpfeil deklariert ist. Und in Ihrem Fall ist this der globale Gültigkeitsbereich, der any ist. Dies ist, was es in kompiliert wird:

var _this = this; 
var fooObj = { 
    bar: function() { 
     // TS does not error out when I access this.baz 
     console.log(_this.baz); 
    } 
}; 

Dies ist, wie es in einer Klasse aussieht:

class Bar 
{ 
    private var = 23; 
    public makeSound =() => console.log(this.var) 
} 

// Compiles into: 

var Bar = (function() { 
    function Bar() { 
     var _this = this; 
     this.var = 23; 
     this.makeSound = function() { return console.log(_this.var); }; 
    } 
    return Bar; 
}()); 
Verwandte Themen