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:

  1. Lägg till ".d.ts" i resolve.extensions i din webpack.config.js-fil
  2. Använd ".ts"-ändelsen istället för ".d.ts" i din AppsScriptTypes.d.ts-fil