重所周知,ts 不是运行时能够检查数据类型的,那么如何去检查接口返回的类型。
api.then(res: responseType =>{
// 如何去定义这个 responseType
})
查阅了一些资料,目前业内有专门的库和用 JSON 来校验。两个都有一定的学习成本。有没有更好的方案。
Check API response data with interface in Typescript Angular
掌握甩锅技术: Typescript 运行时数据校验
1
cloudzqy 2021-03-03 16:53:56 +08:00
熟悉 react 的话,直接用 prop-types 来检验?这个学习成本最小了。
|
2
shelter07 2021-03-03 17:02:55 +08:00
直接让 java 老哥把他定义的类发给你一份,抄一下,可行否,目前项目里用的 swagger 跟 pont,
|
3
renmu123 2021-03-03 17:26:28 +08:00 via Android
你是要检查数据的合法性还是仅仅写代码的时候编辑器有个提示,这两种需求不一致
|
4
estarsyang1 OP @cloudzqy 对 react 不太熟。第一次项目在 vue 上跑的。有点痛苦
|
5
estarsyang1 OP @shelter07 没法检测类型是否正确....只是定义了
|
6
estarsyang1 OP @renmu123 检查数据结构是否符合要求。
|
7
lcwylxx921 2021-03-03 19:12:31 +08:00
可以看下 TS 对 Assertion Function 的支持
|
8
xarthur 2021-03-03 19:16:57 +08:00
我记得 TS 现在已经有了可以在运行时把 string 之类的东西转换成一个类型的功能,叫做 Template Literal Types,不知道能不能满足你的要求。
https://www.typescriptlang.org/docs/handbook/2/template-literal-types.html 我对 TS 也不是很熟( |
9
momocraft 2021-03-03 19:21:55 +08:00
IIRC template literal 也是纯编译时的
|
10
momocraft 2021-03-03 19:23:19 +08:00
应该没有 0 成本的方法
至于谁出这个成本,你可以让上游提供 openapi spec 等能生成 TS 类型的东西 |
11
SilencerL 2021-03-03 19:50:52 +08:00
这个命题我个人感觉在开发中没有实际意义,你在 response 回调中定义了类型了,那么就是默认信任接口返回的就是你所定义的类型。
也就是说接口返回的类型结构你要提前知道并且定义相应的 ts 类型,如果有多种返回值类型那就用联合类型;甚至说如果你实在不知道用什么类型那就用 any 。 如果实在要判断返回值是否是给定的某个类型,可以试试 https://www.npmjs.com/package/typescript-is |
12
ciaoly 2021-03-03 23:54:30 +08:00 via Android
在 resolve 的回调函数里直接指定参数类型不行吗?引用的时候再做数据完整性校验,或者 Object.assign,或者??=。
|
13
Sparetire 2021-03-04 08:42:24 +08:00 via Android
前后端都用 JSON Schema 滤一遍,但是没必要,特别是前端,通常一个检验 schema 的库增加打包体积也不少了
接口规范定好后,类型不对直接甩锅后端,最多自己再做点防御性处理 序列化后类型丢失这也不是 TS 的问题,虽说 TS 不检查运行时类型,但是即便检查了,序列化该丢还是得丢,这种事情你给 Java 错误的 JSON 他运行时也得错 唯一的区别是 TS/JS 他不会在接口返回处 crash,但是如果你不是写的 Anyscript,那只要出现运行时类型错了直接看接口返回就完事了,TS 已经帮你把错误范围限定在这了 |
14
estarsyang1 OP @lcwylxx921 最近一直子忙,都没时间看。谢谢大佬
|
15
estarsyang1 OP @xarthur 我去看看
|
16
estarsyang1 OP @momocraft 我去喵喵,有点头疼,准备上线
|
17
estarsyang1 OP @SilencerL 谢谢大佬。目前采取的是 any 了。吐了
|
18
estarsyang1 OP @ciaoly 好像也是一种思路。相当于使用时再去校验,貌似没啥问题。
|
19
estarsyang1 OP @Sparetire 谢谢大佬,之前想检验一下类型的返回,却忘记了体积的问题。总的来说,感觉是一个投入大,回报小的事情
|