web-dev-qa-db-ja.com

この呼び出しに一致するオーバーロードはありません。タイプ「string」はタイプ「Signals」に割り当てることができません

TypeScriptを使用してマイクロサービスを構築し、信号も処理しています。コードは数日前までは正常に機能していましたが、最近エラーが発生し始めました。問題の修正が見つかりませんでした。

シグナルを処理するためのコード。ファイルの一部にすぎません。 src/main.ts

  enum signals {
    SIGHUP = 1,
    SIGINT = 2,
    SIGTERM = 15
  }
  const shutdown = (signal, value) => {
    logger.warn("shutdown!")
    Db.closeAll()
    process.exit(value)
  }
  Object.values(signals).forEach(signal => {
    process.on(signal, () => {
      logger.warn(`process received a ${signal} signal`)
      shutdown(signal, signals[signal])
    })
  })

私がする時 ts-node src/main.ts次のエラーがスローされ、失敗して終了します。


/home/meraj/.nvm/versions/node/v8.10.0/lib/node_modules/ts-node/src/index.ts:245
    return new TSError(diagnosticText, diagnosticCodes)
           ^
TSError: ⨯ Unable to compile TypeScript:
src/main.ts:35:16 - error TS2769: No overload matches this call.
  The last overload gave the following error.
    Argument of type 'string | signals' is not assignable to parameter of type 'Signals'.
      Type 'string' is not assignable to type 'Signals'.

35     process.on(signal, () => {
                  ~~~~~~

  node_modules/@types/node/base.d.ts:653:9
    653         on(event: Signals, listener: SignalsListener): this;
                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    The last overload is declared here.

    at createTSError (/home/meraj/.nvm/versions/node/v8.10.0/lib/node_modules/ts-node/src/index.ts:245:12)
    at reportTSError (/home/meraj/.nvm/versions/node/v8.10.0/lib/node_modules/ts-node/src/index.ts:249:19)
    at getOutput (/home/meraj/.nvm/versions/node/v8.10.0/lib/node_modules/ts-node/src/index.ts:362:34)
    at Object.compile (/home/meraj/.nvm/versions/node/v8.10.0/lib/node_modules/ts-node/src/index.ts:395:32)
    at Module.m._compile (/home/meraj/.nvm/versions/node/v8.10.0/lib/node_modules/ts-node/src/index.ts:473:43)
    at Module._extensions..js (module.js:663:10)
    at Object.require.extensions.(anonymous function) [as .ts] (/home/meraj/.nvm/versions/node/v8.10.0/lib/node_modules/ts-node/src/index.ts:476:12)
    at Module.load (module.js:565:32)
    at tryModuleLoad (module.js:505:12)
    at Function.Module._load (module.js:497:3)

任意の修正をいただければ幸いです。または、なぜそれが2日前に機能し、今では機能しなかったのかがわかる場合。

19
M A SIDDIQUI

私にもこの奇妙な問題がありましたが、タイプアサーションを使用して回避しました(私の場合は文字列列挙型を使用しています)。

(Object.values(someEnum) as string[]).concat(otherStringArray);
3
kitsu.eb

これは、無名関数に誤った数の引数を渡したときに発生することがあります。

    Object.keys(data).reduce((key: string) => {

    }, {}); 

エラーが発生します:

この呼び出しに一致するオーバーロードはありません。オーバーロード1/3

正しい数の引数を渡します。

    Object.keys(data).reduce((acc: any, key: string) => {
    }, {});
0
Donato

解決策1: numeric enumsignalsを保持する

Object.values(signals)
  // numeric enum includes reverse mapping, filter numbers out and keep "SIGHUP" etc.
  .filter((s): s is NodeJS.Signals => typeof s !== "number") 
  .forEach(signal => {
    process.on(signal, ...) // works now
  })

解決策2:純粋な信号文字列リテラルタイプを使用する

// these string literal items are strongly typed by built-in NodeJS.Signals type
Object.values<NodeJS.Signals>(["SIGHUP", "SIGINT", "SIGTERM"])
  .forEach(signal => {
    process.on(signal, ...) // works now
  })

解決策3: string enum に変更します(逆マッピングなし)

enum signals2 {
  SIGHUP = "SIGHUP",
  SIGINT = "SIGINT",
  SIGTERM = "SIGTERM"
}

Object.values(signals2)
  .forEach(signal => {
    process.on(signal, ...) // works now
  })

エラーが発生するのはなぜですか?

signalsのような数値列挙には、 逆マッピング が含まれます。たとえば、次のことができます。

const r1 = signals.SIGHUP // r1 value: 1
const r2 = signals[signals.SIGINT] // r2 value: "SIGINT"
const r3 = signals[15] // r3 value: "SIGTERM"

そのため、Object.values(signals)(string | signals)[]が返されます。ここで、stringは列挙型キーを表し、signalsは列挙型値を表します。

ここで、パラメータsignal in process.on(signal, ...) は、 事前定義されたノードの1つである必要があります.JS文字列リテラルタイプ 。ただし、string | signalsアイテムタイプを渡すため、この時点でTSは怒鳴ります。

0
ford04