typescript如何结构并确定不为undefined?
这一行代码,是node express后端解构request params的
const {search,role,status,sort,pageNo,perPage} = req.query
在typescript 里面需要给前面的变量赋一个类型
const {search,role,status,sort,pageNo,perPage}:TypeParams = req.query
在这里TypeParams必须全部弄成可选的字段,如下
type TypeParams={
search?:string
role?:string
xxx
xxx
}
如果没有可选,也就是"?",typescript立刻报错。Property search is missing in type "ParsedQs" but required in TypeParams.
问题:
- 这个报错信息是什么意思?parsedQs是哪里来的?
- 我用中间件给这些字段都已经提前赋值年,到了解构这一步,我明确知道它们是不可能undefined.如何写代码才能避免添加“?”,我不想要处理undefined,因为我明确知道不会underfined,都是有默认值的。
- 这个结构赋值的过程中,如何写代码才能省略给变量添加这个TypeParams?能够让typescript自己推断?
我是一个初学typescript的小白,希望大佬能够稍微详细的说说,让我从这个案例中能够感悟到更多typescript的工作机制。
感谢
回复
1个回答

test
2024-06-28
第一个问题TypeParams的意思是在ParsedQs类型里没有找到search属性,但在TypeParams里有。ParsedQs是Express框架里用来解析查询字符串的类型的第二个问题用类型断言:
type TypeParams = {
search: string;
role: string;
// ...
};
const { search, role, status, sort, pageNo, perPage } = req.query as unknown as TypeParams;
不想一个个加?;
type TypeParams = {
[K in keyof typeof req.query]: NonNullable<typeof req.query[K]>;
};
const { search, role, status, sort, pageNo, perPage }: TypeParams = req.query;
第三个问题还是要写类型,还是用类型断言吧
回复

适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容