Website-Suche

Wie transpiliert man mit TypeScript nur bestimmte Dateien?


Also, hier ist mein Plan. Ich möchte eine Anwendung mit TypeScript für Windows und Mac bauen. Da ich den TypeScript-Code jedoch in JavaScript-Code transpilieren werde, möchte ich, wenn möglich, einige Funktionen erreichen. Ich möchte nur Windows-Code bekommen, wenn ich ihn will, und nur Mac-Code, wenn ich ihn will.

Der Weg, wie ich es machen möchte, oder zumindest versuche, ist, das exclude in tsconfig.json zu verwenden.

Lassen Sie uns ein einfaches Beispiel nehmen. Im Stammprojekt würde ich einen src-Ordner haben. Darin würde ich eine code.ts-Datei haben. Außerdem: code.darwin.ts und code.windows.ts-Dateien.

code.darwin.ts:

const Logger = () => {
    console.log('DARWIN');
}

export default Logger;

code.windows.ts:

const Logger = () => {
    console.log('WINDOWS');
}

export default Logger;

code.ts:

import Logger from './code.darwin';
import Logger from './code.windows';

Logger();

In diesem Beispiel, wenn ich nur Mac-Code möchte, würde ich tsconfig.json verwenden:

{
  "compilerOptions": {

    "target": "ES2017",                                /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */
    "module": "commonjs",                           /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */
    "outDir": "./dist",                        /* Redirect output structure to the directory. */
    "rootDir": "./src",                       /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
    "strict": true,                                 /* Enable all strict type-checking options. */
    "alwaysStrict": true,                        /* Parse in strict mode and emit "use strict" for each source file. */
    "typeRoots": ["./node_modules/@types"],                             /* List of folders to include type definitions from. */
    "esModuleInterop": true,                        /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
    "skipLibCheck": true,                           /* Skip type checking of declaration files. */
    "forceConsistentCasingInFileNames": true        /* Disallow inconsistently-cased references to the same file. */
  },
  "exclude": ["**/*.windows.ts"],
}

Aber trotzdem habe ich einen TS-Konfliktfehler in code.ts, weil ich dasselbe aus 2 Dateien importiere. Irgendwelche Ideen, wie man das lösen kann?

Die Art und Weise, wie ich es mache, ist kein Muss. Ich bin offen für andere Vorschläge unter Verwendung von Typescript. Das Wichtigste ist, dass ich am Ende nur einen OS-Plattform-Code erhalten kann.

Antwort #1

Sie können die dynamische Importfunktion von TypeScript verwenden. Sie sollten process.platform verwenden, um es zum Laufen zu bringen.

Bearbeiten Sie Ihre code.ts-Datei wie folgt:

import(`./code.${process.platform}`).then((logger) => {
    logger();
});

Lassen Sie alle anderen Dateien gleich.

Beachten Sie den Importausdruck. Passen Sie ihn an Ihre Bedürfnisse an.

Verwandte Artikel