TypeScriptで動的な `this`値のタイプを定義するにはどうすればよいですか?

気候

たとえば、このコードを考えると:

async function forEachAsync<T>(
    iterable: T[],
    callback: (this: typeof context, currentValue: T, index: number, array: typeof iterable) => void | Promise<void>,
    context?: any
){
  const { length } = iterable;
  for (let i = 0; i < length; i++){
    await callback.call(context, iterable[i], i, iterable);
  }
}

thisコールバック関数のタイプは常にでanyあるため、そのプロパティのチェックは実行されません。たとえば、以下のコードは.charAtプロパティの型チェックに失敗するはずですが、型がany次の理由で失敗するはずです。

forEachAsync([1, 2, 3], function(){
  console.log(this.charAt);  // Should fail type check but couldn't
}, window);

型チェックをthis可能にするために、私は以下を試しました:

async function forEachAsync<T, C = any>(
    iterable: T[],
    callback: (this: typeof context, currentValue: T, index: number, array: typeof iterable) => void | Promise<void>,
    context?: C
){
  const { length } = iterable;
  for (let i = 0; i < length; i++){
    await callback.call(context, iterable[i], i, iterable);
  }
}

これで、関数を呼び出すと、型の検証が機能します。ただし、別のエラーが発生します。

forEachAsync([1, 2, 3], function(){
  console.log(this.charAt);
  // Error: Object is possibly undefined.
  // [expected] Error: Property 'charAt' does not exist on type 'Window & typeof globalThis'
}, window);

質問

どのように私は適切に型を定義することができますcontextし、this維持しながら、同じようにcontextオプションのパラメータを?

アレクセイL.

オーバーロードを使用できます。1つは使用context、もう1つは使用しません

async function forEachAsync<T>(
    iterable: T[],
    callback: (this: Window, currentValue: T, index: number, array: typeof iterable) => void | Promise<void>,
): Promise<void>
async function forEachAsync<T, C>(
    iterable: T[],
    callback: (this: C, currentValue: T, index: number, array: typeof iterable) => void | Promise<void>,
    context: C
): Promise<void>
async function forEachAsync<T, C>(
    iterable: T[],
    callback: (currentValue: T, index: number, array: typeof iterable) => void | Promise<void>,
    context?: C
): Promise<void>
{
  const { length } = iterable;
  for (let i = 0; i < length; i++){
    await callback.call(context, iterable[i], i, iterable);
  }
}

forEachAsync([1, 2, 3], function(){
  console.log(this.charAt); // Property 'charAt' does not exist on type 'Window & typeof globalThis'
}, window);

遊び場

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

golangで動的な「タイプ構造体」を定義するにはどうすればよいですか?

分類Dev

このタイプのデータをgolangで定義するにはどうすればよいですか?

分類Dev

関連するタイプの特性境界を定義するにはどうすればよいですか?

分類Dev

Typescriptにオブジェクトのキーを推測させ、その値のタイプを定義するにはどうすればよいですか?

分類Dev

一意のボタンタイプを定義するにはどうすればよいですか?

分類Dev

postgresでJSONのレコードタイプを定義するにはどうすればよいですか

分類Dev

複数の値を持つタイプにモナドインスタンスを定義するにはどうすればよいですか?

分類Dev

typescriptで明示的に異なるタプルタイプを持つタプル配列を定義するにはどうすればよいですか?

分類Dev

C ++ 11で強力なIDタイプを定義するにはどうすればよいですか?

分類Dev

16バイトに等しいタイプを定義するにはどうすればよいですか?

分類Dev

入力タイプ「datetime-local」の値を設定するにはどうすればよいですか?

分類Dev

Typescript-可能な値の配列から型を動的に定義するにはどうすればよいですか?

分類Dev

Typescriptでマップのタイプエイリアスのインデックス署名を定義するにはどうすればよいですか?

分類Dev

XFCEでプライマリモニターを定義するにはどうすればよいですか?

分類Dev

XFCEでプライマリモニターを定義するにはどうすればよいですか?

分類Dev

Sencha Touchで日付タイプを定義するにはどうすればよいですか?

分類Dev

AWS.CognitoIdentityServiceProviderからタイプ定義をロードするにはどうすればよいですか?

分類Dev

Typescriptでlodashreduce関数の戻り値の型を定義するにはどうすればよいですか?

分類Dev

Typescript-別のプロパティに基づいてタイプを条件付きで定義するにはどうすればよいですか?

分類Dev

Typescriptインターフェイスの関数の戻り値の型voidを定義するにはどうすればよいですか?

分類Dev

小包-タイプ定義を追加するにはどうすればよいですか?

分類Dev

動的に決定されたタイプのGetComponentsInChildrenを取得するにはどうすればよいですか?

分類Dev

イテレータのすべての値がtrueの場合にtrueを返す関数を定義するにはどうすればよいですか?

分類Dev

値のタイプがキーに依存しているが、すべてのキーが事前にわかっているわけではない場合、インターフェイスを定義するにはどうすればよいですか?

分類Dev

スタイルが特定の値で定義されている要素を選択するにはどうすればよいですか?

分類Dev

スタイルが特定の値で定義されている要素を選択するにはどうすればよいですか?

分類Dev

他のAdd-Typeタイプ定義でAdd-Type定義タイプにアクセスするにはどうすればよいですか?

分類Dev

TypeScriptでMaterialUIグリッドサイズプロップの値を動的に設定するにはどうすればよいですか?

分類Dev

タイプ `regex`の` match_pattern`を使用してelasticsearch動的テンプレートを定義するにはどうすればよいですか?

Related 関連記事

  1. 1

    golangで動的な「タイプ構造体」を定義するにはどうすればよいですか?

  2. 2

    このタイプのデータをgolangで定義するにはどうすればよいですか?

  3. 3

    関連するタイプの特性境界を定義するにはどうすればよいですか?

  4. 4

    Typescriptにオブジェクトのキーを推測させ、その値のタイプを定義するにはどうすればよいですか?

  5. 5

    一意のボタンタイプを定義するにはどうすればよいですか?

  6. 6

    postgresでJSONのレコードタイプを定義するにはどうすればよいですか

  7. 7

    複数の値を持つタイプにモナドインスタンスを定義するにはどうすればよいですか?

  8. 8

    typescriptで明示的に異なるタプルタイプを持つタプル配列を定義するにはどうすればよいですか?

  9. 9

    C ++ 11で強力なIDタイプを定義するにはどうすればよいですか?

  10. 10

    16バイトに等しいタイプを定義するにはどうすればよいですか?

  11. 11

    入力タイプ「datetime-local」の値を設定するにはどうすればよいですか?

  12. 12

    Typescript-可能な値の配列から型を動的に定義するにはどうすればよいですか?

  13. 13

    Typescriptでマップのタイプエイリアスのインデックス署名を定義するにはどうすればよいですか?

  14. 14

    XFCEでプライマリモニターを定義するにはどうすればよいですか?

  15. 15

    XFCEでプライマリモニターを定義するにはどうすればよいですか?

  16. 16

    Sencha Touchで日付タイプを定義するにはどうすればよいですか?

  17. 17

    AWS.CognitoIdentityServiceProviderからタイプ定義をロードするにはどうすればよいですか?

  18. 18

    Typescriptでlodashreduce関数の戻り値の型を定義するにはどうすればよいですか?

  19. 19

    Typescript-別のプロパティに基づいてタイプを条件付きで定義するにはどうすればよいですか?

  20. 20

    Typescriptインターフェイスの関数の戻り値の型voidを定義するにはどうすればよいですか?

  21. 21

    小包-タイプ定義を追加するにはどうすればよいですか?

  22. 22

    動的に決定されたタイプのGetComponentsInChildrenを取得するにはどうすればよいですか?

  23. 23

    イテレータのすべての値がtrueの場合にtrueを返す関数を定義するにはどうすればよいですか?

  24. 24

    値のタイプがキーに依存しているが、すべてのキーが事前にわかっているわけではない場合、インターフェイスを定義するにはどうすればよいですか?

  25. 25

    スタイルが特定の値で定義されている要素を選択するにはどうすればよいですか?

  26. 26

    スタイルが特定の値で定義されている要素を選択するにはどうすればよいですか?

  27. 27

    他のAdd-Typeタイプ定義でAdd-Type定義タイプにアクセスするにはどうすればよいですか?

  28. 28

    TypeScriptでMaterialUIグリッドサイズプロップの値を動的に設定するにはどうすればよいですか?

  29. 29

    タイプ `regex`の` match_pattern`を使用してelasticsearch動的テンプレートを定義するにはどうすればよいですか?

ホットタグ

アーカイブ