1. ホーム
  2. typescript

[解決済み】ブロックスコープ付き変数の再宣言ができない(typescript)

2022-01-27 19:31:34

質問

私はnodeアプリを構築しており、.jsの各ファイルの内部は、様々なパッケージでこれを必要とするために使用されています。

let co = require("co");

しかし

などです。つまり、typescriptを使用すると、プロジェクト全体でこのような宣言/要求は1つしかできないようですね? 私は次のように考えていたので、この点について混乱しています。 let は、現在のファイルにスコープされていました。

あるプロジェクトが動作していたのですが、リファクタリング後、あちこちでこのようなエラーが発生するようになりました。

どなたか説明してください。

どのように解決するのですか?

エラーそのものについて let を宣言するために使用されます。 ローカル の中に存在する変数です。 ブロックスコープ 関数スコープではなく また var だから、こんなことはできない。

if (condition) {
    let a = 1;
    ...
    let a = 2;
}

また、以下のことに注意してください。 case の中の節は switch ブロックは独自のブロックスコープを作成しないので、同じローカル変数を複数の case を使用せずに {} を使用して、それぞれブロックを作成します。


インポートに関しては、おそらくTypeScriptがあなたのファイルを実際のモジュールとして認識せず、一見モデルレベルの定義がそのためのグローバル定義になってしまうために、このエラーが発生しているのでしょう。

外部モジュールのインポートは、標準の ES6 この方法では、明示的な代入は行われず、TypeScript があなたのファイルをモジュールとして正しく認識するようになります。

import * as co from "./co"

という名前のものがあると、やはりコンパイルエラーになります。 co は、予想通り、すでに 例えば、これはエラーになりそうです。

import * as co from "./co"; // Error: import definition conflicts with local definition
let co = 1;


エラーが発生した場合 モジュール co" が見つかりません。 ...

TypeScriptはモジュールに対して完全な型チェックを実行しているので、インポートしようとしているモジュールのTS定義がない場合(定義ファイルのないJSモジュールである場合など)には 宣言 モジュールは .d.ts の定義ファイルには、モジュールレベルのエクスポートは含まれていません。

declare module "co" {
    declare var co: any;
    export = co;
}