我正在使用typescript-eslint v3.1.0,并且在TypeScript中具有以下类型保护功能:
interface JWTPayload {
sub: number;
}
function isJWTPayload(obj: unknown): obj is JWTPayload {
if (typeof obj !== 'object') {
return false;
}
// eslint-disable-next-line @typescript-eslint/ban-types
const obj2 = obj as object;
if (!('sub' in obj2)) {
return false;
}
const obj3 = obj2 as JWTPayload;
if (!Number.isInteger(obj3.sub)) {
return false;
}
return true;
}
我的问题是这样的:在我认为是常见的情况下,禁用皮棉规则并不好。是否有可以避免这种情况的TypeScript模式?
一些背景:
在https://github.com/typescript-eslint/typescript-eslint/pull/848中引入了被禁用的typescript-eslint规则,其中规定“ 99.9%的时间,您不想使用[“ object”类型],而绝大多数代码库都不想使用它“。他们为什么这么说呢?似乎在验证用户输入时都会使用它。还有其他方法可以不强制转换为“ any”吗?
typeof
本身就是类型保护者。因此,您只需将逻辑移到if
块内即可:
function isJWTPayload(obj: unknown): obj is JWTPayload {
if (typeof obj === 'object' && obj) {
if (!('sub' in obj)) {
return false;
}
const payload = obj as JWTPayload;
if (Number.isInteger(payload.sub)) {
return true;
}
}
return false;
}
我也将删除!('sub' in obj)
支票,因为它没有意义。如果sub
为undefined
,则也Number.isInteger(undefined)
返回false
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句