javascript - Förvänta dig att typescript tsc ska kasta ett fel men inget kastades
I IDE:n som används för att redigera TypeScript-koden finns en varning i checkApp.ts som säger:
Argument type { someWrongParams: any } is not assignable to parameter type AddAppToListParams.
Men när jag kör tsc kastas inget fel. Hur får jag ett fel att visas när jag kör tsc.
tsconfig.json
{
"compilerOptions": {
"allowJs": true,
"noEmit": true,
"pretty": true,
"strict": true,
"strictFunctionTypes": true,
"noImplicitReturns": true,
"module": "ES6",
"target": "ES6"
},
"exclude": [
"node_modules",
"dist"
],
"include": [
"./src/**/*"
]}
Kod kontrolleraApp.ts
interface CheckAppParams {
appId: string;
}
export default (app: any) => async (requestParams: CheckAppParams): Promise<any> => {
const { appId } = requestParams;
await app.tasks.addAppToList({ someWrongParams: appId });
};
läggTillAppTillLista.ts
interface AddAppToListParams {
appId: string;
}
export default (app: any) => async (requestParams: AddAppToListParams): Promise<any> => {
const { appId } = requestParams;
app.list.push(appId);
};
uppgifter.ts
import checkApp from './checkApp';
import addAppToList from './addAppToList';
export default (app: any) => async (): Promise<any> => {
app.tasks = {
addAppToList: addAppToList(app),
checkApp: checkApp(app),
};
};
Svar #1
Om du vill att tsc ska ge ett fel kan du definiera app som ett interface och referera till det istället för any, annars kommer TypeScript-kompilatorn inte att veta vad det är.
Att definiera din app som ett gränssnitt kommer att göra det möjligt för kompilatorn att känna igen felet:
export interface App {
tasks: {
addAppToList: (requestParams: AddAppToListParams) => Promise<any>;
checkApp: (requestParams: CheckAppParams) => Promise<any>;
};
list: any; // you can make it whatever it needs to be.
}
Genomförbarheten av ett sådant interface beror på din användning av appen. Ovanstående interface är bara ett exempel, det kan vara vad som helst du behöver att det ska vara.
Alternativt kan du lägga till en förbygg-hook i din package.json för att göra en lintkontroll innan du kör tsc för att kolla efter de varningar som din IDE ger och förhindra att tsc körs. Du kommer behöva använda samma linter-regler som din IDE använder, men det gör det möjligt för dig att lägga till mer strikta kontroller i din byggprocess än endast standard Typescript-regeluppsättningen som definieras i din tsconfig.json
Så istället för tsc använd npm run build från den plats där du tidigare körde tsc
package.json:
"scripts": {
"prebuild": "do your lint checks here with can throw errors if you want",
"build": "tsc"
},
Svar #2
Det är korrekt att tsc inte rapporterar ett fel när man kompilerar koden du visar i frågan. Din förväntan är felaktig.
I checkApp.ts definierar du explicit parametern för den exporterade funktionen som (app: any). Därför är app.tasks inne i funktionen också av typen any och app.tasks.addAppToList är även den av typen any och kompilatorn låter dig göra vad du vill med den. Det finns ingen anledning för kompilatorn att ge ett fel när du gör app.tasks.addAppToList({ someWrongParams: appId });.
När det gäller varför din IDE markerar ett fel finns det inte tillräckligt med information i frågan för att förklara det. Kanske har du ändrat din kod för att klistra in den här på ett sätt som inte bevarade kritisk information. Kanske arbetar din IDE med andra filer än de du skickar till kompilatorn. (Jag skulle vilja säga att det aldrig har hänt mig, men ibland vid stora omstruktureringar blev jag distraherad, tappade bort handlingen och lyckades korskoppla mina kablar en stund.) Faktum är att felmeddelandet du visar antyder en skillnad mellan koden din IDE arbetar med och koden du visar i frågan. Koden i frågan skickar ett argument av typen: { someWrongParams: string } men felmeddelandet från IDE:n klagar på en parameter av typen { someWrongParams: any }.
