Typescript ei anna virhettä väärän lupauksen paluuarvotyypistä
käyttämällä Typescript 2.0.7
Kun käytetään q-lupauksia jopa silloin, kun määritellään funktion palautustyyppi tai vastaava then, niin kauan kuin funktio saattaa palauttaa null, mikä tahansa tyypin rajoitus kumotaan ja väärät ratkaisutyypit eivät aiheuta virhettä.
import Q = require('q');
class Foo {
prop1: string;
prop2: number;
}
function test () : Q.IPromise<Foo>
{
return Q.resolve('stuff')
.then<Foo>(() =>
{
if(Math.random() > 0.5)
{
return Q.resolve({ id: 3, value: new Foo() }) // This should throw an error
}
else
{
return Q.resolve(null);
}
});
}
Lisäksi, kun yritettiin testata samaa käyttäytymistä ES6-lupausten (Promises) kanssa, seuraava koodi ei myöskään aiheuttanut virhettä.
function test(): Promise<Foo>
{
return new Promise((resolve, reject) => {
resolve('foo');
})
}
Voisiko joku selittää tämän käyttäytymisen ja mitä tehdä saadakseen oikean virheen vai onko tämä TypeScriptin virhe? (Olen nähnyt useita ongelmia, jotka kuvaavat samanlaisia tilanteita, mutta mikään niistä ei todella pystynyt selittämään tätä käyttäytymistä)
Vastaus #1
Kun palautat ei-geneerisen Promise-olion, se tulkitaan itse asiassa muodossa Promise<{}>, joka voidaan osoittaa tyypille Promise<Foo>. Siksi se nyt heittää virheen resolve-kohdassa, se voi olla mitä tahansa.
Koodisi tulisi olla tällainen ollakseen vahvasti tyypitetty.
function test(): Promise<Foo>
{
return new Promise<Foo>((resolve, reject) => {
resolve('foo'); //compile error here
})
}
