2016-12-21 3 views
1

Ich lerne noch Typoskript so vielleicht bin ich nur im Grunde etwas fehlt, aber ich verstehe nicht, warum der folgende Code einen Übersetzungsfehler führt:Warum gibt TypeScript keinen Kompilierungsfehler für diese Versprechenskette?

// An example without Promises (does not compile) 
function getAnObject(): Object { 
    return { value: 'Hello' }; 
}; 

function doSomethingWithAString(input: String) { 
    console.log(input); 
} 

const result = getAnObject(); 
// error TS2345: Argument of type 'Object' is not assignable to parameter of type 'String' 
doSomethingWithAString(result); 

Aber der folgende Code nicht:

// A similar example with Promises (compiles) 
function getAnObjectAsync(): Promise<Object> { 
    return Promise.resolve({ value: 'Hello' }); 
}; 

getAnObjectAsync().then(function (result: String) { 
// Throws a runtime exception 
console.log(result.toUpperCase()); 
}); 

Warum meldet TypeScript nicht, dass die onfulfilled-Funktion des .then im Promise-Beispiel result: Object erhält?

  • Mache ich etwas falsch?
  • Gibt es etwas, das ich über dieses Beispiel nicht verstehe?

Antwort

4

Das ist, weil in TS, die Art der Argumente der Funktionen bivariant sind.

Im Fall eines Promise.then wird jede übergebene Funktion akzeptiert, vorausgesetzt, ihr Argument ist entweder ein Subtyp oder ein Supertyp des erforderlichen Typs. So wird ein Objekt (Object, {}) immer akzeptiert. Zum Glück wird es immer noch weitgehend unvereinbare Arten von Kurs fangen; wie ein { x: string} erwarten, aber erhalten eine { y: number }, so dass es die Mehrheit der Typfehler fängt.

Dies ist eine Designentscheidung, die Vor- und Nachteile hat; (persönlich, ich denke, es war es nicht wert) sie könnten es sogar in der Zukunft ändern, da die letzten Versionen von TS klar in die Richtung gehen, TS immer besser klingen zu lassen.

+0

Was ist ein Profi, um Funktionen bivariant zu machen? – Bergi

+0

ich bin auch nicht überzeugt :) aber sie schrieben das: https://github.com/Microsoft/TypeScript/wiki/FAQ#why-are-function-parameters-bivariant Die Tatsache, dass Sie nicht definieren können eigene Varianz und dass Dinge in JS mutiert werden kann, hilft nicht – AlexG

+0

Danke für den Link. Ich stimme der Schlussfolgerung nicht zu und denke, dass ihr Argument fehlerhaft ist, aber zumindest haben sie eins :-) – Bergi

Verwandte Themen