Typescript kastar inte fel vid felaktig returtyp för promise


använder Typescript 2.0.7

När man använder q-löften, även när man deklarerar en definierad returtyp för funktionen eller till och med respektive then, så länge funktionen kan returnera null överskrids alla typerestriktioner och felaktiga resolve-typer utlöser inget fel.

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);
      }
   });
}

Dessutom, när man försökte testa samma beteende med ES6-promises kastade följande kod inte heller ett fel.

function test(): Promise<Foo>
{
   return new Promise((resolve, reject) => {
    resolve('foo');
   })
}

Kan någon förklara detta beteende och vad man ska göra för att få det korrekta felet eller är detta en bugg i TypeScript? (Jag har sett flera problem som beskriver liknande situationer men ingen av dem kunde verkligen förklara detta beteende)

Svar #1

När du returnerar ett icke-generiskt Promise kommer det faktiskt att tolkas som Promise<{}>, vilket kan tilldelas Promise<Foo>. Det är därför det nu kastar ett fel på resolve, det kan vara vad som helst.

Din kod bör vara sådan här för att vara starkt typad.

function test(): Promise<Foo>
{
   return new Promise<Foo>((resolve, reject) => {
    resolve('foo'); //compile error here
   })
}