typescript - Ambienta moduler i andra filer fungerar med tsc men inte med webpack + ts-loader?
Jag leker med att lära mig ambient-moduler i TypeScript, med ett litet leksaksexempel av MailApp, en global modul i Google Apps Script (se här). Det jag gör är bara att skriva min kod i VS Code, kompilera den med webpack, och sedan kopiera detta som ES5-kod till en Apps Script-konsol för att köra.
Mitt problem: för koden nedan, när jag flyttar deklarationen av den omgivande modulen till en .d.ts-fil och använder en trippel-skrift-direktiv för att referera till den, känner både TSC och VS-kod igen detta. Dock visar webpack + ts-loader (awesome-typescript-loader har samma problem) alltid ett fel:
Module not found: Error: Can't resolve 'MailApp'
Saknar jag något här?
Min deklarationsfil: root/src/AppsScriptTypes.d.ts
declare module 'MailApp' {
export interface EmailOptions {
bcc?: string;
cc?: string;
htmlBody?: string;
name?: string;
noReply?: boolean;
replyTo?: string;
}
export function sendEmail(
recipient: string,
subject: string,
body: string,
options?: EmailOptions): void;
}
Min huvudfil: root/src/SendMail.ts
/// <reference path="./AppsScriptTypes.d.ts" />
import * as MailApp from 'MailApp';
MailApp.sendEmail(
'[email ',
'Sample Email Title',
'Sample Email Body', {
noReply: true,
cc: '[email ',
});
Min root/webpack.config.js:
module.exports = {
entry: './src/SendMail.ts',
output: {
filename: 'bundle.js',
path: __dirname,
},
resolve: {
extensions: ['.ts', '.tsx',],
},
module: {
rules: [
{
loader: 'ts-loader',
test: /\.(t|j)sx?$/,
exclude: /node_modules|MockMailApp\.js/,
}
]
},
};
När jag inte använder trippel-snutt-referensen + separat fil och istället flyttar deklarationen till SendMail.ts-filen, får webpack + ts-loader inget fel, men detta är förstås inte att föredra:
declare module MailApp {
...
} // this works for webpack when shown like this in SendMail.ts
MailApp.sendEmail(...);
...
Saknas det någon konfiguration någonstans? Jag använder webpack 2.4.1, TypeScript 2.3, ts-loader 2.0.3. Tack för all hjälp!
Svar #1
Jag är inte säker på om det kommer att hjälpa, men du kan prova ett av följande:
- Lägg till ".d.ts" i resolve.extensions i din webpack.config.js-fil
- Använd ".ts"-ändelsen istället för ".d.ts" i din AppsScriptTypes.d.ts-fil