私は、プロンプトを増やそうとしています。それには、TypeScriptドキュメントのGlobal augmentationで説明されているように余分なメソッドを追加します。プロミスの拡張は、新しいプロミス(...)のタイプ推論を中断する
そして、それはテスト1で正常に機能しますが、何らかの理由で、それは約束のための型推論を破るには、テストでコンストラクタを使用して作成2.活字体はPromise<boolean>
として推論タイプを停止し、代わりにPromise<{}>
としてそれを推測します。私の拡張を取り除くと、コンストラクターを使って作成されたPromise
のジェネリック型が正しく推論されます。
なぜ起こるのか、どのように修正するのですか?ここで
は、私が何をしようとしているの簡単な例です:
// src/test.ts
// augmentation
interface Promise<T> {
myCustomMethod(): T;
}
// test 1
let data: number = Promise.resolve(42)
.then((value) => value + 4)
.myCustomMethod();
// test 2
let p2: Promise<boolean> = new Promise((resolve) => {
resolve(true);
})
そして、私の設定:私は取得しています
// tsconfig.json
{
"compilerOptions": {
"module": "es6",
"target": "es6",
"baseUrl": "./src"
}
}
エラーは次のとおりです。
src/test.ts(9,5): error TS2322: Type 'Promise<{}>' is not assignable to type 'Promise<boolean>'.
Type '{}' is not assignable to type 'boolean'.
UPD
私はそのタイプが常にテスト2のためにPromise<{}>
と推測されているのを見ています。しかし、今私は理解できません、なぜこのエラーは私の増強なしでは報告されません。 Type '{}' is not assignable to type 'boolean'.
以降、このエラーは増強なしで表示されるべきではありませんか?
それが意図されているかどうかを理解しようとしているか、TypeScript開発者に報告してください。
感謝をあなたは答えて回避策を講じます。更新された質問をご覧ください。私の増強なしにエラーがなぜ現れないのかを詳しく説明できますか? –
あなたの増強なしでは、 'T'は関数の引数型として' Promise'にのみ表示され、TypeScriptには[関数互換性規則]があります(https://www.typescriptlang.org/docs/handbook/type-compatibility.html# 'boolean'は' {} 'に代入できるので 'function(x:{})'を 'function(x:boolean)'とコンパチブルにしています。戻り値に 'T'を付けると、' {} 'が' boolean'に代入されないので、それらは互換性がありません。 – artem
[関数型の互換性を示す例](https://www.typescriptlang.org/play/#src=var%20f1%20%3D%20function%20(x%3A%20ブール値)%3A%20無効【請求項2】請求項1に記載の方法であって、前記第1の電極は、前記第1の電極と前記第2の電極との間に配置され、 0D%0Af1%20%3D%20F2%3B%20%2F%2F%20ok%0D%0Af2%20%3D%20F1%3B%20%2F%2F%20ok%0D%0A%0D%0Avar%20f3% 20%3D 20%20%20%20%20%20%20%10%20%7%20%10%20%7% 20%7B%20%20%7%7%7%3%20%3%20%3%20%3%20%3%20%3%20%3%20%3%20%3% 20%2F%2F%20ok%0D%0A) – artem