Weird typings error for es6 promise
<p>Code</p>

<pre><code>getToken(authCode: string): Promise&lt;Token&gt; {
    return fetch(tokenUrl, { method: "POST" }).then(res =&gt; res.json()).then(json =&gt; {
        if (json["error"]) {
            return Promise.reject(json);
        }
        return new Token(json);
    });
}
</code></pre>

<p>Tsc(2.0.6) reports error:</p>

<pre><code>xxx.ts(135,81): error TS2345: Argument of type '(json: any) =&gt; Promise&lt;never&gt; | Token' is not assignable to p
arameter of type '(value: any) =&gt; PromiseLike&lt;never&gt;'.                                                               
  Type 'Promise&lt;never&gt; | Token' is not assignable to type 'PromiseLike&lt;never&gt;'.                                      
    Type 'Token' is not assignable to type 'PromiseLike&lt;never&gt;'.                                                     
      Property 'then' is missing in type 'Token'.
</code></pre>

<p>Tsconfig.json:</p>

<pre><code>{
    "compilerOptions": {
        "target": "es5",
        "module": "commonjs",
        "lib": [
            "es6",
            "dom"
        ]
    }
}
</code></pre>

<p>Typings for promise is defined in <code>node_modules/typescript/lib/lib.es2015.iterable.d.ts</code></p>

<hr>

<p>However, if I do not return rejected Promise:</p>

<pre><code>getToken(authCode: string): Promise&lt;Token&gt; {
    return fetch(tokenUrl, { method: "POST" }).then(res =&gt; res.json()).then(json =&gt; {
        return new Token(json);
    });
}
</code></pre>

<p>There will be no errors. So how can I return a rejected promise?</p>