node.js - TSNode + Mocha: Ignorera TypeScript-fel (låt kompilatorn generera vid fel och låt TSNode köra genererad kod)
I koden nedan, även om funktionen test2 är ogiltig, bör det inte påverka testningen av funktionen test1:
export function test1(): boolean {
return true;
}
export function test2(): number {
return "1";
}
Test :
import { assert as Assert } from "chai";
import { test1 } from "./example";
describe("Example", (): void => {
it("Example", (): void => {
Assert.isTrue(test1());
});
});
Men Mocha, som körs av TSNode kommer att misslyckas:
TSError: ⨯ Unable to compile TypeScript:
Source/ProjectBuilder/example.ts(6,3): error TS2322: Type '"1"' is not assignable to type 'number'.
Möjligt att tvinga TSNode att slutföra ovanstående test? TypeScript har alternativet noEmitOnError...
Min mocharc.yaml:
extension:
- ts
spec: "**/*.test.ts"
require:
- ts-node/register
- tsconfig-paths/register
Varför jag behöver det
Enligt Clean Architecture, "Företagsregler får inte bero på något, och de måste vara testbara". Men även om företagsregler inte beror på vyer, kontroller osv., kan vi inte testa dem om det finns några fel i vyer, kontroller osv.
När jag ändrar affärslogiken i min applikation blir allt som är beroende av den ogiltigt. Anta att i min entitet i affärslogiken type User { name: string; age: number } har ändrats till typen User { fullName: string; age: string; }. Allt som är beroende av affärslogiken (vyer, kontroller, presentatörer etc.) blir ogiltigt - jag måste även korrigera det enligt den uppdaterade affärslogiken.
// In business rules:
type User = {
ID: number;
fullName: string;
age: string; // in past - number
}
// In controller:
class UserProfileController {
// ...
// All what comes from input field is string ↓
private onClickChangeUserAge(inputtedUserAge: string) {
// This expression obeys to previous version of business rules!
this.targetUser.age = Number(inputtedUserAge);
// TypeScript will emit type error, when I try to test business rules,
// however business rules does not depend on controller.
}
}
Men i stora applikationer kan dessa korrigeringar ta dagar, veckor och månader. Hur kan vi få feedback som bevisar att åtminstone affärslogiken fungerar korrekt och att vi är på rätt väg?
Svar #1
Det skulle inte vara meningsfullt för dig att be Typescript att ignorera typer. Det du beskriver är likt att be om en räknare som bekräftar att 2 + 2=5, bara temporärt, eftersom du så småningom kommer att be om 2 + 3=5 men det kan ta mycket lång tid.
Antagandet i din fråga är att number och string är tillräckligt kompatibla för att din affärslogik ska vara korrekt oavsett om test2 returnerar 1 eller "1". Detta är inte sant: Som exempel, 1 + 1 == 2, "1" + 1 == "11", och "1" - 1 == 0. Beroende på vilket av dessa som gäller i ditt fall kan det att bortse från typer låta dig testa din affärslogik, eller ge dig falsk tilltro till ett trasigt system. Jag vågar påstå att generellt sett räknas datatyper som en del av den affärslogik du försöker verifiera--vad skulle datamodellen räknas som, om inte affärslogik?
Istället beskriver du en gradvis migration under vilken affärsreglerna säkerställer att test2 returnerar string | number. Genom att beskriva migrationen noggrant i typsystemet kan du kanske bekräfta att affärslogiken tillämpas korrekt--om det gäller under hela din migration--och även tillhandahålla en typ som du endast kan använda från vissa moduler och anropsplatser som kan skärpas när du slutför migrationen.
Svar #2
type User = {
ID: number;
fullName: string;
age: string | number
}
Du kan specificera båda typerna för att göra migreringen enklare och slippa använda //@ts-ignore överallt.
Detta kommer att lägga till korrekta förslag överallt som:
