如何使typescript严格选项完全工作?

如何使typescript严格选项完全工作?,typescript,visual-studio,express,typescript-typings,Typescript,Visual Studio,Express,Typescript Typings,我已经强制了strict选项,但typescript并没有抱怨没有在代码段中定义port、req、res的类型。我正在使用Vscode以及如何完全强制执行它 import express from 'express'; const app = express(); const port = 3000; app.get('/', (req, res) => { res.send('Hello !'); }); app.listen(port, err => { if (err

我已经强制了strict选项,但typescript并没有抱怨没有在代码段中定义port、req、res的类型。我正在使用Vscode以及如何完全强制执行它

import express from 'express';

const app = express();
const port = 3000;
app.get('/', (req, res) => {
  res.send('Hello !');
});
app.listen(port, err => {
  if (err) {
    return console.error(err);
  }
  return console.log(`server is listening on ${port}`);
});
tsconfig.json

{
  "compileOnSave": true,
  "compilerOptions": {
    "module": "commonjs",
    "esModuleInterop": true,
    "target": "es6",
    "moduleResolution": "node",
    "sourceMap": true,
    "outDir": "dist"
  },
  "strict": true,    
  "lib": ["es2015"],
  "--isolatedModules":true,
}
tsc的-strict是一组单独编译器选项的简写,这些选项都不需要在任何地方注释变量/参数。编译器非常乐意为未注变量和参数推断类型,大多数情况下,这是首选约定。time-strict真正抱怨缺少注释的唯一原因是编译器无法为它推断出一个好的类型,而转而使用它。但这只是为了避免您意外地使用不安全的any类型,而不是试图提醒您注释所有内容

在上面的代码中,未注释的app常量被推断为Express类型;端口被推断为3000类型,req和res被推断为Request和Response类型,就像您自己对它们进行了如下注释一样:

import express, { Express, Request, Response } from 'express';
const app: Express = express();
const port: 3000 = 3000;
app.get('/', (req: Request, res: Response) => {
  res.send('Hello !');
});
编译器唯一不满意的地方是类型函数的app.listen回调,其中err参数没有上下文类型,编译器会选择任何上下文类型。因此,这里是您唯一需要注释的地方:

app.listen(port, (err: any) => {
  if (err) {
    return console.error(err);
  }
  return console.log(`server is listening on ${port}`);
});
这就是说,如果您想要投诉每个未注变量或参数,您应该使用类似于或与tsc一起使用的过梁

如果使用TSLint,则可以启用,这需要存在类型定义。有一些子选项专门针对函数参数参数和箭头参数的声明以及变量变量声明和变量声明忽略函数的声明

如果使用ESLint,则可以启用its,这需要存在类型注释。同样,函数参数parameter和arrowParameter以及变量声明variableDeclaration都有子选项

这两种方法中的任何一种都会让你得到你想要的行为。但是,传统智慧认为类型推断是一件好事。正如ESLint的TyPulf文档所说:如果你不考虑写不必要的类型注释的代价是合理的,那么不要使用这个规则。 好吧,希望这会有帮助;祝你好运