【问题标题】:Typescript error TS2717: Subsequent property declarations must have the same typeTypescript 错误 TS2717:后续的属性声明必须具有相同的类型
【发布时间】:2022-09-30 12:25:09
【问题描述】:

当我在本地主机上进行开发时,打字稿构建工作正常。但是当使用 docker 和节点映像时,当我想构建时,它会产生这个奇怪的错误:

src/middlewares/auth.ts(16,13): error TS2717: Subsequent property declarations must have the same type.
Property \'user\' must be of type \'UserModel\', but here has type \'UserModel\'.

UserModel 这里有什么问题?

// auth.ts
import { Request, Response, NextFunction } from \'express\';
import { AuthService } from \'../services/auth.service\';
import { UserService } from \'../services/user.service\';
import { UserModel } from \'../models/user.model\';
import { Resp } from \'../utils/Response\';
import { AuthErrEnum } from \'../enums/auth/auth-message.enum\';

const authService = new AuthService();
const userService = new UserService();

declare global {
    namespace Express {
        interface Request {
            user: UserModel;
        }
    }
}

export async function authMiddleware(req: Request, res: Response, next: NextFunction) {

    const authorization = req.headers.authorization;
    if(!authorization) return Resp.error(AuthErrEnum.NO_TOKEN_PROVIDED,401).send(res)

    const token = authorization.split(\' \')[1];
    if(!token) {
        return Resp.error(AuthErrEnum.NO_TOKEN_PROVIDED, 401).send(res)
    }

    let payload;
    try{
        payload = await authService.decodeToken(token);
    } catch(err) {
        return Resp.error(AuthErrEnum.INVALID_TOKEN, 401).send(res)  
    }    
    
    const user = await userService.findWithRelations(payload.id);
     
    req.user = user;

    next();
}
// package.json
{
  \"scripts\": {
    \"dev\": \"ts-node-dev src/app.ts\",
    \"start\": \"node build/app.js\",
    \"build\": \"del build/* && tsc\",
  },
  \"dependencies\": {
    \"ts-node-dev\": \"^2.0.0\",
    \"typescript\": \"^4.2.4\",
  },
  \"devDependencies\": {
    \"@types/express\": \"^4.17.13\",
    \"@types/node\": \"^16.10.3\",
    \"del-cli\": \"^4.0.1\"
  }
}

// tsconfig
{
  \"compilerOptions\": {
    /* Visit https://aka.ms/tsconfig.json to read more about this file */

    /* Basic Options */
    // \"incremental\": true,                   /* Enable incremental compilation */
    \"target\": \"ES2018\",                          /* 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\'. */
    // \"lib\": [],                             /* Specify library files to be included in the compilation. */
    \"allowJs\": true,                       /* Allow javascript files to be compiled. */
    // \"checkJs\": true,                       /* Report errors in .js files. */
    // \"jsx\": \"preserve\",                     /* Specify JSX code generation: \'preserve\', \'react-native\', or \'react\'. */
    // \"declaration\": true,                   /* Generates corresponding \'.d.ts\' file. */
    // \"declarationMap\": true,                /* Generates a sourcemap for each corresponding \'.d.ts\' file. */
    // \"sourceMap\": true,                     /* Generates corresponding \'.map\' file. */
    // \"outFile\": \"./\",                       /* Concatenate and emit output to single file. */
    \"outDir\": \"./build/\",                        /* Redirect output structure to the directory. */
    // \"rootDir\": \"./\",                       /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
    // \"composite\": true,                     /* Enable project compilation */
    // \"tsBuildInfoFile\": \"./\",               /* Specify file to store incremental compilation information */
    // \"removeComments\": true,                /* Do not emit comments to output. */
    // \"noEmit\": true,                        /* Do not emit outputs. */
    // \"importHelpers\": true,                 /* Import emit helpers from \'tslib\'. */
    // \"downlevelIteration\": true,            /* Provide full support for iterables in \'for-of\', spread, and destructuring when targeting \'ES5\' or \'ES3\'. */
    // \"isolatedModules\": true,               /* Transpile each file as a separate module (similar to \'ts.transpileModule\'). */

    /* Strict Type-Checking Options */
    \"strict\": true,                           /* Enable all strict type-checking options. */
    // \"noImplicitAny\": true,                 /* Raise error on expressions and declarations with an implied \'any\' type. */
    // \"strictNullChecks\": true,              /* Enable strict null checks. */
    // \"strictFunctionTypes\": true,           /* Enable strict checking of function types. */
    // \"strictBindCallApply\": true,           /* Enable strict \'bind\', \'call\', and \'apply\' methods on functions. */
    // \"strictPropertyInitialization\": true,  /* Enable strict checking of property initialization in classes. */
    // \"noImplicitThis\": true,                /* Raise error on \'this\' expressions with an implied \'any\' type. */
    // \"alwaysStrict\": true,                  /* Parse in strict mode and emit \"use strict\" for each source file. */

    /* Additional Checks */
    // \"noUnusedLocals\": true,                /* Report errors on unused locals. */
    // \"noUnusedParameters\": true,            /* Report errors on unused parameters. */
    // \"noImplicitReturns\": true,             /* Report error when not all code paths in function return a value. */
    // \"noFallthroughCasesInSwitch\": true,    /* Report errors for fallthrough cases in switch statement. */
    // \"noUncheckedIndexedAccess\": true,      /* Include \'undefined\' in index signature results */

    /* Module Resolution Options */
    // \"moduleResolution\": \"node\",            /* Specify module resolution strategy: \'node\' (Node.js) or \'classic\' (TypeScript pre-1.6). */
    // \"baseUrl\": \"./\",                       /* Base directory to resolve non-absolute module names. */
    // \"paths\": {},                           /* A series of entries which re-map imports to lookup locations relative to the \'baseUrl\'. */
    // \"rootDirs\": [],                        /* List of root folders whose combined content represents the structure of the project at runtime. */
    // \"typeRoots\": [],                       /* List of folders to include type definitions from. */
    // \"types\": [],                           /* Type declaration files to be included in compilation. */
    // \"allowSyntheticDefaultImports\": true,  /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
    \"esModuleInterop\": true,                  /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies \'allowSyntheticDefaultImports\'. */
    // \"preserveSymlinks\": true,              /* Do not resolve the real path of symlinks. */
    // \"allowUmdGlobalAccess\": true,          /* Allow accessing UMD globals from modules. */

    /* Source Map Options */
    // \"sourceRoot\": \"\",                      /* Specify the location where debugger should locate TypeScript files instead of source locations. */
    // \"mapRoot\": \"\",                         /* Specify the location where debugger should locate map files instead of generated locations. */
    // \"inlineSourceMap\": true,               /* Emit a single file with source maps instead of having a separate file. */
    // \"inlineSources\": true,                 /* Emit the source alongside the sourcemaps within a single file; requires \'--inlineSourceMap\' or \'--sourceMap\' to be set. */

    /* Experimental Options */
    \"experimentalDecorators\": true,        /* Enables experimental support for ES7 decorators. */
    // \"emitDecoratorMetadata\": true,         /* Enables experimental support for emitting type metadata for decorators. */

    /* Advanced Options */
    \"skipLibCheck\": true,                     /* Skip type checking of declaration files. */
    \"forceConsistentCasingInFileNames\": true,  /* Disallow inconsistently-cased references to the same file. */
  },
  \"exclude\": [
    \"nginx\",
    \"ecosystem.config.js\"
  ]
}
  • 诡异的。定期构建然后运行程序是否有效?如果是这样,那么您的 Dockerfile 中有问题。

标签: node.js typescript express


【解决方案1】:

在 UserModel 上使用 Go To Definition 并确保所有声明都具有相同的类型签名。换句话说,确保属性的每个声明都是布尔类型或扩展布尔类型。由于某些奇怪的原因,这也适用于方法上的泛型类型。显然你不能用额外的泛型指定一个新的泛型重载。

这个答案也可能会更加清晰:https://stackoverflow.com/a/73071602/258482

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    • 2019-02-06
    • 2016-11-07
    • 2017-11-15
    • 2018-04-18
    • 2020-01-03
    • 1970-01-01
    相关资源
    最近更新 更多