例如我定义了两个接口的入参类型:
interface ParamsA {
a: string;
}
interface ParamsB extends ParamsA {
b: number;
}
然后有两个接口apiA
和apiB
:
const param: ParamsA | ParamsB = {
a: 'xxx'
}
if (/* 某个成立的条件 */) {
param.b = 0 // 但是在这里就提示说 ParamsA 没有 b 属性
apiA(param)
} else {
apiB(param)
}
目前处理方式是这样的(但我想用上面那种方法,还是说我上面那种定义param
的时候就错了?):
const param: ParamsA = {
a: 'xxx'
}
if (/* 某个成立的条件 */) {
(param as ParamsB).b = 0 // 这里就没问题了
apiA(param as ParamsB)
} else {
apiB(param)
}
之前还有写一种方法就是把b
写成可选的,但是我是想明确区分apiA
和apiB
的入参类型,所以就没有这么写
interface ParamsA {
a: string;
b?: number;
}
不知道大佬能不能理解我的意思?我记得我之前好像看过在if()
里面可以直接把param
的类型判断好,但是我if
又没有用到param
,所以不太知道这里怎么写,请大佬指点一下~
更新一下,看到@搬砖工 大佬的回答确实我一开始是没看懂的,所以就没有在意,后面发现好像有点不对劲,才认真去思考了一下这个回答,确实需要自我批评一下,理论上这个就是我需要的答案,关键就在于in
这个关键字在ts中的作用以及ts的版本问题导致我在考虑这个回答的时候没有采纳,因为我去试了一下ts推导出来的是never
,不是我想要的ParamsB
(只有在一开始定义了b
的话才能正确推导出ParamsB
,但其实这样子也没有意义了)。但为什么在ts 3.7.5能正确推导而在后面就不能了我好像还是没有翻到答案,不过我觉得应该这里用in
是没问题的。
参考:
what-does-the-in-keyword-do-in-typescript
why-is-this-objects-type-resolving-to-one-side-of-a-type-union