TypeScript导出函数异常:getSensitiveUser非函数的排查求助
TypeScript导出函数无法识别为函数的异常排查
在TypeScript+Express开发场景中,调用导出的控制器函数时触发TypeError: users.getSensitiveUser is not a function错误,相关代码逻辑及问题细节如下:
1. 类型定义文件(../types)
export type role = "Client" | "Admin"; export interface User { id: number; nickname: string; email: string; verifiedEmail: boolean; password: string; role: role; avatar: string; } export type SensitiveUser = Omit<User, "email" | "password">;
2. 控制器文件(../controllers/user.ts)
import { SensitiveUser, User } from "../types"; import usersData from "./user.json"; const user: User[] = usersData as User[]; export const getUsers = (): User[] => { return user; }; export const getSensitiveUser = (): SensitiveUser[] => { return user; };
3. 模拟数据JSON文件(./user.json)
[ { "id": 1, "nickname": "qwe", "email": "qwe@fakemail.com", "verifiedEmail": true, "password": "1234", "role": "client", "avatar": "url" }, { "id": 2, "nickname": "asd", "email": "asd@fakemail.com", "verifiedEmail": false, "password": "1234", "role": "admin", "avatar": "url" } ]
4. Express路由文件(../routes/users.ts)
import express from "express"; import * as users from "../controllers/user"; const router = express.Router(); router.get("/", (_req, res) => { res.send(users.getSensitiveUser()); }); router.post("/", (_req, res) => { res.send("post user"); }); export default router;
触发的错误信息
TypeError: users.getSensitiveUser is not a function at D:\Proyectos\listil\api\src\routes\users.ts:7:18
排查方向与解决方案
核心排查点及修复方式:
- 路径/文件名校验:确认路由中
../controllers/user的导入路径是否正确,控制器文件是否为user.ts(注意大小写:Windows系统不区分,但Linux/macOS严格区分,避免因大小写不匹配导致导入错误)。 - TS编译配置检查:查看
tsconfig.json中的module、outDir等配置,确保编译后的JS文件输出路径与导入路径匹配,避免误导入未编译的TS文件或错误目录下的文件。 - 导出/导入语法适配:
若当前导出语法存在编译后不兼容的情况,可修改控制器为默认导出:
对应路由修改导入方式:// 控制器文件新增默认导出 export default { getUsers, getSensitiveUser };import users from "../controllers/user"; - 附带类型隐患修复:注意JSON中
role值为小写client/admin,但类型定义中是大写Client/Admin,类型断言as User[]会存在类型不匹配的隐患,后续可能引发其他错误,建议统一大小写规范。
内容的提问来源于stack exchange,提问作者Elbongo
相关产品推荐
相关产品推荐

