バグを説明する
インポートエイリアス@/
を使用しましたが、機能しました。 次に、Viteに切り替えましたが、rootエイリアスのみがサポートされています。 そこで、 /@/
エイリアスを使用するようにコードを切り替えました。 コンパイルしてブラウザで動作しますが、vscodeでエラーが発生します:
再現するには
/@/
インポートを使用する
予想される行動
すべてが機能します
システム(以下の情報を入力してください):
また、tsconfig / jsconfig.jsonを使用して、typescriptのエイリアスを構成する必要があります。
https://www.typescriptlang.org/docs/handbook/module-resolution.html#path -mapping
tsc
が問題なくコンパイルできるという同じ問題にも直面しています。 ただし、 svelte-check
ようなツールは、エイリアスパスを正しく解決できず、OPのようなエラーをスローします。 language-tools
がプロジェクトフォルダのtsconfig.json
を正しく解決できないことに関連するバグがあるようです。
このエラーは、svelte2tsxによって挿入された特別なプロパティを使用してコンポーネントのタイプチェックを行ったためです。 実際のファイルが見つからない場合、svelte2tsxを使用してファイルを変換することはできません。
@cayter tsconfigをどこに置きますか?
@ jasonlyu123以下は、バックエンドとフロントエンドの両方のモノリポジトリである私のプロジェクトフォルダ構造です。
.
├── Makefile
├── README.md
├── database
│ └── database.rules.json
├── firebase.json
├── firestore
│ ├── firestore.indexes.json
│ └── firestore.rules
├── functions // backend code
│ ├── package-lock.json
│ ├── package.json
│ ├── src
│ │ └── index.ts
│ └── tsconfig.json
├── hosting // frontend PWA code
│ ├── ...
│ ├── src
│ │ ├── components
│ │ │ ├── App.svelte
│ │ │ └── ...
│ │ ├── images
│ │ │ ├── cover.png
│ │ │ └── ...
│ │ ├── index.css
│ │ ├── index.ts
│ │ ├── pages
│ │ │ ├── Auth
│ │ │ │ └── ...
│ │ │ ├── Error
│ │ │ │ └── ...
│ │ │ ├── Home
│ │ │ │ └── ...
│ │ │ └── User
│ │ │ └── ...
│ │ └── stores
│ │ └── ...
│ ├── svelte.config.js
│ ├── tailwind.config.js
│ ├── tsconfig.json
│ ├── vite.config.ts
│ └── workbox.config.js
├── package-lock.json
└── package.json
hosting / tsconfig.json
{
"compilerOptions": {
"allowSyntheticDefaultImports": true,
"baseUrl": "src",
"declaration": true,
"emitDecoratorMetadata": true,
"esModuleInterop": true,
"experimentalDecorators": true,
"forceConsistentCasingInFileNames": true,
"importHelpers": true,
"importsNotUsedAsValues": "error",
"isolatedModules": true,
"lib": ["dom", "esnext", "es6"],
"module": "esnext",
"moduleResolution": "node",
"noEmit": true,
"noImplicitAny": true,
"noImplicitReturns": true,
"noImplicitThis": true,
"rootDir": "src",
"skipLibCheck": true,
"sourceMap": true,
"strict": true,
"strictBindCallApply": true,
"strictFunctionTypes": true,
"strictPropertyInitialization": true,
"strictNullChecks": true,
"target": "esnext",
"types": ["jest", "node", "svelte"],
"paths": {
"/@/*": ["*"]
}
},
"include": ["src/**/*"],
"exclude": ["node_modules/*", "public/*"]
}
実際のファイルが見つからない場合、svelte2tsxを使用してファイルを変換することはできません。
はい、これはプロジェクトのtsconfig.json
定義されているエイリアスパス解決が尊重されていないことに関連しています。 したがって、エイリアスパスを使用する代わりに相対パスに変更すると、vscode拡張機能とsvelte-checkは、 ComboBox
コンポーネントのOPのスクリーンショットからわかるエラーをスローしなくなります。
vscodeの出力チャンネルを確認できますか?右側のドロップダウンでsvelteを選択してください。 そして、あなたがこのようなものを持っているかどうかを確認してください
Initialize new ts service at c:/Current Projects/svelte-app/tsconfig.json
そしてここにログを投稿してください。
これを再現できます。 何らかの理由で、 getDefinitionAndBoundSpan
はそのような場所からインポートされたTS / JSファイルを処理できますが、 .svelte
ファイルは処理できません。
問題はmodule-loader
内部にあり、「絶対パス」のチェックが真であるため、通常のTS解決に委任されます(Linuxでは/
始まるファイルパスは絶対パスです)。 「このプレフィックスはtsconfigパスの一部ですか」について追加のチェックが必要だと思います。
OPは実際に@/
で動作すると言っていましたが、私はそれを見逃しました。 申し訳ありません😅
私はあなたたちがどれほど素晴らしいかを言うのを忘れました。 迅速な対応ありがとうございました
最も参考になるコメント
問題は
module-loader
内部にあり、「絶対パス」のチェックが真であるため、通常のTS解決に委任されます(Linuxでは/
始まるファイルパスは絶対パスです)。 「このプレフィックスはtsconfigパスの一部ですか」について追加のチェックが必要だと思います。