Предположим, у меня есть какой-то файл JSON (назовем его template.json
)
{
"myField1": "",
"myField2": ""
}
У меня также есть некий универсальный класс
export default GenericClass<T> {
// Creating an empty constuctor with passed type.
// to allow define type automatically.
// This allow us not to manually set generic type for class
// and also allows Webpack to pick up changes.
constructor(template?: T) {}
// ...some fields and methods
get typedField(): T {
return /* something slightly calculated */
}
}
Я использую его каквведите мой проект Typescript:
import GenericClass from "path/to/GenericClass"
import template from "template.json"
export type TemplateType = typeof template
export default new GenericClass(template)
// we can also write
// export default new GenericClass<TemplateType>()
// but in this case the changes in template.json
// won't be picked up by Webpack.
// However, this does not affects the problem,
// it occurs in both cases.
Я использую webpack
dev-сервер и использую его где-нибудь:
import * as React from "react"
import GenericInstance from "path/to/GenericInstance"
export default MyComponent extends React.Component {
render() {
var { typedField } = GenericInstance
return (
<main>
<p>{typedField.myField1} {/* ok */}</p>
<p>{typedField.myField2} {/* ok */}</p>
</main>
)
}
}
После этого я добавляю новое полев мой template.json
:
{
"myField1": "",
"myField2": "",
"myField3": ""
}
Сохранение.webpack
dev-сервер фиксирует это изменение в template.json
.Отлично. Одна важная вещь заключается в том, что автозаполнение VSCode работает (это показывает myField3
в списке доступных полей).Отлично.
В этот момент, когда я пытаюсь использовать myField3
в MyComponent
(например, <p>{typedField.myField3}</p>
), awesome-typescript-loader
отправляет ошибку во время компиляции:
Свойство 'myField3' не существует для типа '{"myField1": string;"myField2": строка;} '
Очевидно, что awesome-typescript-loader
не обнаружил изменений в template.json
, который используется как тип в моем GenericClass
.
Как я могу победить?После перезапуска dev-сервера он работает нормально, пока я не внесу изменения в template.json
.
Частично webpack.config.js
, package.json
и tsconfig.json
config = {
rules: {
{
test: /\.tsx?$/,
loader: "awesome-typescript-loader",
exclude: /node_modules/
},
{
enforce: "pre",
test: /\.js$/,
loader: "source-map-loader"
},
}
}
{
"devDependencies": {
"awesome-typescript-loader": "^5.2.1",
"source-map-loader": "^0.2.4",
"typescript": "^3.3.3",
"webpack": "^4.29.3",
"webpack-cli": "^3.2.3",
"webpack-dev-server": "^3.1.14"
}
}
{
"compilerOptions": {
"module": "esnext",
"target": "es5",
"moduleResolution": "node",
"baseUrl": "src",
"allowSyntheticDefaultImports": true,
"noImplicitAny": true,
"strict": false,
"sourceMap": true,
"outDir": "dist/",
"jsx": "react",
"traceResolution": true,
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"allowJs": true,
"declaration": false,
"removeComments": true,
"noLib": false,
"preserveConstEnums": true,
"suppressImplicitAnyIndexErrors": true,
"types": [ "node" ],
"lib": ["es6", "dom", "dom.iterable"],
"downlevelIteration": true,
"resolveJsonModule": true,
"typeRoots": [
"./node_modules/@types"
]
},
"include": [
"src/**/*"
]
}
Обновление
Я могу подтвердить, что это происходит только с импортированным * .json.Возможно, проблема может быть связана с настройкой resolveJsonModule
для TypeScript, но не уверен.Установка useCache
и usePrecompiledFiles
в false
явно для awesome-typescript-loader
в webpack.config.js
не помогает.Я имею в виду, изменилось webpack.config.js
теперь выглядит так:
{
test: /\.(t|j)sx?$/,
loader: "awesome-typescript-loader",
options: {
useCache: false,
usePrecompiledFiles: false
},
exclude: /node_modules\/(?!superagent)/,
},