タイトルの通りなんですが、初め1でfullfillされるPromiseが渡ってくる、と思ってはまりました。MDNのPromise.resolve(value)
の説明にもちゃんと書いてありますね。
引数で与えられた値で完了されたPromise オブジェクトを返します。値が成功なら (すなわちthen メソッドを持っている)、返されるプロミスは成功に従い、その最終的な状態を採用します。さもなければ、返されるプロミスはその値で失敗にされます。
new Promise((res) => { new Promise((r) => { r(1); }); })
もおそらく一緒で、node4で実行したら1が返りました。
DefinitelyTyped/es6-promise.d.ts だと直和型を使ってPromise<R>
型に対して、
then<U>(onFulfilled?: (value: R) => U | Thenable<U>, onRejected?: (error: any) => U | Thenable<U>): Promise<U>;
のように書いてあります。thenの定義を載せましたが、他も同様に直和型です。onFullfilled?
がR
を受け取ってThenable<U>
を返す関数だと、then
が返すインスタンスの型は、Promise<Promise<U>>
型ではなく、Promise<U>
型なんですね。