У меня есть проект, который является расширением кода против, но я думаю, что это не слишком важно.
У меня есть следующая структура:
./package.json
./tsconfig.json --> references [ ./client, ./server, ./interfaces]
./client
package.json
tsconfig.json
webpack.config.js
./server
package.json
tsconfig.json
webpack.config.js
./interfaces
package.json
tsconfig.json
импорт клиента и сервера из проекта интерфейсов, который просто содержит некоторые типы, интерфейсы, перечисления, пространства имен и т. д. c, которые совместно используются обоими. Что бы это ни стоило, мне все равно, если webpack дублирует это и в клиентский пакет. js и в сервер. js, но я не хочу скопировать / вставить код между ними.
Когда я запускаю свой веб-пакет, я получаю ошибки, подобные приведенным ниже, где бы я ни ссылался на типы из interfaces
. Я должен отметить, что нормальное построение через tsc -b
работает отлично.
TS2769: перегрузка не соответствует этому вызову. Перегрузка 1 из 3, '(тип: RequestType0 <{}, неизвестно, неизвестно>, обработчик: RequestHandler0 <{}, неизвестно>): void', вызвала следующую ошибку. Аргумент типа 'RequestType' не может быть назначен параметру типа 'RequestType0 <{}, unknown, unknown>'. Типы свойств '_' несовместимы. Введите '[MyType, MyOtherType, void, void, _EM] | undefined 'нельзя назначить типу' [{}, неизвестно, неизвестно, _EM] | не определено. Тип '[MyType, MyOtherType, void, void, _EM]' нельзя назначить типу [[{}, unknown, unknown, _EM] '. Типы собственности «3» несовместимы. Тип 'void' нельзя назначить типу '_EM'. Перегрузка 2 из 3, '(тип: RequestType, обработчик: RequestHandler): void', выдало следующую ошибку. Аргумент типа «RequestType» не может быть назначен параметру типа «RequestType». Типы имеют отдельные объявления частной собственности _method. Перегрузка 3 из 3, '(метод: string, handler: GenericRequestHandler <{}, unknown>): void', вызвала следующую ошибку. Аргумент типа 'RequestType' не может быть назначен параметру типа 'string'.
Кажется, что он не может правильно обрабатывать вещи внутри интерфейсов.
Мой конфиг веб-пакета выглядит вот так (они примерно одинаковы, за исключением имен файлов):
// ./shared.webpack.config.js
const path = require('path');
const merge = require('merge-options');
module.exports = function withDefaults(/**@type WebpackConfig*/extConfig) {
/** @type WebpackConfig */
let defaultConfig = {
mode: 'none', // this leaves the source code as close as possible to the original (when packaging we set this to 'production')
target: 'node', // extensions run in a node context
node: {
__dirname: false // leave the __dirname-behaviour intact
},
resolve: {
mainFields: ['module', 'main'],
extensions: ['.ts', '.js'] // support ts-files and js-files
},
module: {
rules: [{
test: /\.ts$/,
exclude: /node_modules/,
use: [{
// configure TypeScript loader:
// * enable sources maps for end-to-end source maps
loader: 'ts-loader',
options: {
compilerOptions: {
"sourceMap": true,
}
}
}]
}]
},
externals: {
'vscode': 'commonjs vscode', // ignored because it doesn't exist
},
output: {
// all output goes into `dist`.
// packaging depends on that and this must always be like it
filename: '[name].js',
path: path.join(extConfig.context, 'out'),
libraryTarget: "commonjs",
},
// yes, really source maps
devtool: 'source-map'
};
return merge(defaultConfig, extConfig);
};
I borrowed these webpack configurations from a similar VS Code extension, although the original extension did not use an `interfaces` project, they just duplicated all the code.
I'm a webpack newbie; how should I modify these configurations to process the interfaces?
// ./client/webpack.config.js
const withDefaults = require('../shared.webpack.config');
const path = require('path');
module.exports = withDefaults({
context: path.join(__dirname),
entry: {
extension: './src/extension.ts',
},
output: {
filename: 'extension.js',
path: path.join(__dirname, 'out')
}
});
edit: если я явно добавлю блок include
в общую конфигурацию webpack для всех 3 папок, я получу другая ошибка, говорящая о том, что типы нельзя назначать, потому что типы ссылаются на другой сторонний пакет, поэтому технически существует два экземпляра этого пакета:
Типы имеют отдельные объявления частного свойства '_method' .