[解決済み] 定義ファイル(*d.ts)にクラスをインポートする。
質問内容
Express Session の型付けを拡張して、セッションストレージでカスタムデータを使用できるようにしたいと思います。私は、オブジェクト
req.session.user
のインスタンスで、私のクラス
User
:
export class User {
public login: string;
public hashedPassword: string;
constructor(login?: string, password?: string) {
this.login = login || "" ;
this.hashedPassword = password ? UserHelper.hashPassword(password) : "";
}
}
を作成しました。
own.d.ts
ファイルを作成し、既存のExpressセッションの型付けに定義をマージします。
import { User } from "./models/user";
declare module Express {
export interface Session {
user: User;
}
}
しかし、これは全く機能しません。VS Codeとtscはそれを見ません。そこで、単純な型を使ってテスト定義を作成しました。
declare module Express {
export interface Session {
test: string;
}
}
そして、テストフィールドは問題なく動作しているので、インポートが問題を引き起こしています。
また
/// <reference path='models/user.ts'/>
しかし、tscはUserクラスを見ませんでした。どうすれば、*d.tsファイルで独自のクラスを使用できますか?
EDIT コンパイル時に定義ファイルを生成するようにtscを設定し、user.d.tsが出来上がりました。
export declare class User {
login: string;
hashedPassword: string;
constructor();
constructor(login: string, password: string);
}
そして、Express Sesionを拡張するための独自のタイピングファイルです。
import { User } from "./models/user";
declare module Express {
export interface Session {
user: User;
uuid: string;
}
}
しかし、まだ上にimport文があると動作しません。何かアイデアはありますか?
どうすればいいですか?
TypeScriptの開発を始めて2年、ようやくこの問題を解決することができました。
基本的にTypeScriptには、local"(通常のモジュール)とambient(グローバル)の2種類のモジュールタイプの宣言があります。2つ目のタイプは、既存のモジュール宣言にマージされるグローバルなモジュール宣言を記述することができる。この2つのファイルの違いは何でしょうか?
d.ts
ファイルは、インポートを持たない場合のみ、アンビエントモジュール宣言として扱われます。import 行を与えると、グローバルなものではなく、通常のモジュールファイルとして扱われるようになり、モジュール定義の補強はうまくいきません。
だから、ここで説明した解決策はすべてうまくいかないわけです。しかし幸いなことに、TS 2.9以降では、グローバルモジュール宣言に
import()
の構文があります。
declare namespace Express {
interface Request {
user: import("./user").User;
}
}
ということは、この行は
import("./user").User;
を実行すると、すべてがうまくいくようになりました :)
関連
-
[解決済み] タイプスクリプトのコンパイルで「tsc コマンドが見つかりません。
-
[解決済み] ts1206 デコレーターはここでは無効です、Angular 2。
-
[解決済み] TypeScriptの円形型参照
-
[解決済み] Apollo Serverでコンテキストオブジェクトを正しく入力するにはどうすればよいですか?
-
[解決済み] TSがモジュールを見つけ出せない
-
[解決済み] TypeScriptでパラメータとして強く型付けされた関数は可能か?
-
[解決済み] TypeScriptの "*.d.ts "について
-
[解決済み] オプションのパラメータを省略しながら、他のオプションのパラメータを渡すには?
-
[解決済み] async/await構文で拒否する方法は?
-
[解決済み】Typescript d.ts ファイルで定義されたインターフェースプロパティタイプのオーバーライド
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Typescript : require文はimport文の一部ではない
-
[解決済み] error TS2339: Property 'x' does not exist on type 'Y'.
-
[解決済み] プロパティ 'values' はタイプ 'ObjectConstructor' に存在しません。
-
[解決済み] タイプスクリプト TS7006 です。パラメータ 'xxx' は暗黙のうちに 'any' 型を持ちます。
-
[解決済み] TypeScriptのオブジェクトリテラルでの型定義
-
[解決済み] 'unknown' vs. 'any'
-
[解決済み] types/* を `dependencies` と `devDependencies` のどちらに入れるかは、どのように決めたらよいですか?
-
[解決済み】TypeScriptのコンパイルでExperimental decoratorsの警告が出る。
-
[解決済み】Visual Studio Codeで.js.mapファイルを非表示にする方法
-
[解決済み】tsconfig.jsonファイルを生成するにはどうしたらいいですか?