2
votes

Fonctionnalités du langage Vscode TS indisponibles lorsque les tests / ** ne sont pas inclus dans le tsconfig

Je voudrais que mes tests dactylographiés reçoivent le linting, la complétion de code, vscode intellisense (fonctionnalités du langage ts) lorsque le dossier de test est adjacent au src . Je ne veux PAS que les tests soient transpilés lorsque je construis mon projet dactylographié.

Mon projet de nœud dactylographié est structuré comme ceci:

{
  "compilerOptions": {
    "baseUrl": ".",
    "module": "commonjs",
    "moduleResolution": "node",
    "outDir": "dist",
    "sourceMap": true,
    "strict": true,
    "target": "ESNext",
    "paths": {
      "*": ["node_modules/*"]
    }
  },
  "include": ["src/**/*"]
}

Avec mon tsconfig:

.    
├── server
│   │ 
│   │    
│   ├── src
│   │   │
│   │   └── app.ts
│   ├── test
│   │   │
│   │   └── app.test.ts
│   ├── node_modules/
│   ├── package-lock.json
│   ├── package.json
│   ├── tslint.json
│   └── tsconfig.json
├── front_end/
└── README.md

Lorsque je navigue vers mes fichiers de test dans vscode, la fonctionnalité de langage vscode ne reconnaît pas les types et les packages installés dans node_modules. SURPRENANT, si j'ouvre vscode uniquement dans le dossier du serveur (comme vous pouvez le voir sur la structure de mon dossier, le serveur n'est pas la racine), les fonctionnalités linguistiques fonctionnent ðŸ§.

Les tests utilisent ts-jest pour s'exécuter, le tsc n'est donc pas nécessaire ici. Serait-il préférable d'étendre un tsconfig.json pour les tests 🤠»?

Est-ce quelque chose qui peut être corrigé dans les paramètres ou dois-je soumettre un bogue à https://github.com/microsoft/vscode/issues/new/choose .


0 commentaires

3 Réponses :


0
votes

Je n'ai pas mon ordinateur pour tester cela mais je pense que vous avez juste besoin d'ajouter le code suivant à votre fichier ts json.

"exclude": [
        "node_modules",
        "**/*.test.ts"
    ]

Décomposer: exclure ** tous les dossiers / * tous les fichiers ts contenant .test.

si vous n'utilisez pas node, vous pouvez omettre la partie node_modules. Mais je le veux dans ma réponse au cas où quelqu'un qui utilise le nœud copie l'exclusion. Par défaut, node_modules est exclu, mais l'ajout de plus de modificateurs peut écraser cela.

bonne chance.

J'espère que c'est ce que vous recherchez.


1 commentaires

L'exclusion n'est pas nécessaire ici car le tsc ne compilera PAS les tests.



0
votes

Oui, vous pouvez étendre votre tsconfig pour en avoir un commun, un de production et un de développement. Dans notre cas, nous avons ceci:

tsconfig.common.json - contient tous les paramètres partagés par le développement et la production.

tsconfig.json - la version de développement qui inclut des tests:

scripts: {
    "dev": "webpack --config webpack.dev.js",
    "build": "webpack --config webpack.prod.js",
}

tsconfig.prod.json - la version de production qui exclut les tests.

rules: [
        {
            test: /\.ts$/,
            exclude: [/bin/, /node_modules/],
            include: /ClientApp/,
            loader: 'ts-loader',
            options: {
                appendTsSuffixTo: [/\.vue$/],
                configFile: 'tsconfig.prod.json'
            }
        }
    ]

Ensuite, avec notre webpack.config, nous avons une configuration similaire:

webpack.common.js - contient tous les paramètres partagés par le développement et la production

webpack.dev.js - utilisez le développement tsconfig:

rules: [
        {
            test: /\.ts$/,
            exclude: [/bin/, /node_modules/],
            include: /ClientApp/,
            loader: 'ts-loader',
            options: {
                appendTsSuffixTo: [/\.vue$/],
                configFile: 'tsconfig.json'
            }
        }
    ]

webpack.prod.js - utilise le tsconfig de production:

{
    "extends": "./tsconfig.common",
    "exclude": ["bin", "node_modules", "tests", "**/*.spec.ts"]
}

Et enfin, le fichier package.json contient les éléments suivants dans la section scripts:

{
    "extends": "./tsconfig.common",
    "exclude": ["bin", "node_modules"]
}

J'espère que cela vous aide.


1 commentaires

Bien qu'il s'agisse d'une bonne solution (je l'ai fait dans le passé), un tsconfig pour un dossier qui ne sera jamais compilé ne semble pas nécessaire. Puisque notre testeur est ts-jest, nos tests devraient juste avoir besoin d'une couverture linter.



2
votes

Vscode a un problème avec un fichier tsconfig racine unique. Un dossier de test adjacent à src utilisera le tsconfig (ajouté dans cette pull request ) mais cela ne fonctionnera pas si le dossier que vous ouvrez est un répertoire au-dessus (par exemple si vous avez un dossier serveur et client). Une solution est en cours de suivi dans ce problème: https://github.com/Microsoft/vscode/issues/12463 .

De plus, si vous souhaitez mettre à niveau vers eslint (tslint est obsolète), l'analyseur dactylographié vous obligera également à ajouter un fichier tsconfig au dossier de test si vous souhaitez conserver le dossier de test exclu dans le tsconfig principal. Lien vers la documentation eslint multi tsconfig .

La solution simple consiste à utiliser deux tsconfig supplémentaires. L' un pour le linter tsconfig.eslint.json et un pour les tests à l' intérieur du test de dossier: test/tsconfig.json avec le contenu suivant:

{
  "extends": "../tsconfig.json",
  "compilerOptions": {
    "noEmit": true
  },
  "include": ["./**/*"]
}

Pas élégant mais une meilleure solution n'existe pas en ce moment.


4 commentaires

Pouvez-vous s'il vous plaît expliquer plus en détail ce qui devrait être dans tsconfig.tests.json et comment devrait-il être lié au tsconfig.json principal dans votre réponse?


@AKd En fait, ce que j'ai fait est dans le dossier /test (qui est adjacent au dossier /src ), j'ai appelé le fichier tsconfig.json et tsconfig.json quoi il ressemble: gist.github.com/Shahaed/9661cf6320e7bb60de828138ef35a856 Cela semble fonctionner . Dans la racine (un niveau au-dessus), il y a un tsconfig.json et tsconfig.eslint.json


Merci beaucoup. En fait, je suis instinctivement venu à la même solution. Cependant, j'ai dû inclure le dossier source ( "include": [".", "../src"] ) dans le fichier test/tsconfig.json pour que l'importation automatique fonctionne dans VSCode: prntscr.com/vkmytx .


@akd intéressant, je fais fonctionner les importations automatiques et je n'en avais pas besoin. C'est une boîte noire pour moi à ce stade.