awesome-typescript-loader не воспринимает изменения в JSON - PullRequest
0 голосов
/ 14 февраля 2019

Предположим, у меня есть какой-то файл 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)/,
},

1 Ответ

0 голосов
/ 01 апреля 2019

Это ошибка в 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 в качестве допустимой цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...