Lim*_*mbo 8 json typescript webpack webpack-dev-server awesome-typescript-loader
假设我有一些JSON文件(将其命名为template.json)
{
    "myField1": "",
    "myField2": ""
}
我也有一种通用的课程
{
    "myField1": "",
    "myField2": ""
}
我在Typescript项目中像一种类型一样使用它:
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 */
    }
}
我正在运行webpack开发服务器,并在某处使用它:
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.
之后,我将新字段添加到我的template.json:
{
    "myField1": "",
    "myField2": "",
    "myField3": ""   
}
保存。webpackdev-server在中进行此更改template.json。行。重要的一点是VSCode的自动完成功能有效(它myField3在可用字段列表中显示了这一点)。精细。
目前,当我尝试使用myField3in MyComponent(如<p>{typedField.myField3}</p>)时,awesome-typescript-loader在编译过程中会发送错误消息:
属性'myField3'在类型'{“ myField1”上不存在:string; “ myField2”:字符串;}'
显然,awesome-typescript-loader没有template.json在my中用作类型的更改GenericClass。
我该如何打败它?重新启动dev-server后,它可以正常工作,直到我在中进行更改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中发生。该问题可能与resolveJsonModuleTypeScript的设置有关,但不确定。设置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)/,
},
这是 中的一个错误awesome-typescript-loader。从 v5.2.1 开始,这里有一个快速修复:
// node_modules/awesome-typescript-loader/dist/instance.js
// ln: 214:
- var EXTENSIONS = /\.tsx?$|\.jsx?$/;
+ var EXTENSIONS = /\.tsx?$|\.jsx?|\.json$/;
显然,作者忘记将.json扩展名包含为有效目标。