如何在不增加代码冗余的情况下移除这段代码中的`as any`断言?
替代
as any的类型安全实现方案 原代码通过as any绕过类型检查,虽然能运行但破坏了TypeScript的类型安全性。这里提供几种简洁且类型安全的实现方式:
方案1:利用in操作符做类型缩小
通过in操作符判断属性是否存在,TypeScript会自动缩小类型范围,无需任何断言:
const defaultError = 'error' type Options = { error: string } | { errorFn: () => string } | {} function parse(options: Options = {}) { return { errorFn: 'errorFn' in options ? options.errorFn : () => ('error' in options ? options.error : defaultError) } }
方案2:调整类型定义为可选属性(更简洁)
原联合类型本质是互斥的可选属性,直接将Options定义为包含可选error和errorFn的单一类型,代码更简洁且完全类型安全:
const defaultError = 'error' type Options = { error?: string; errorFn?: () => string } function parse(options: Options = {}) { return { errorFn: options.errorFn || (() => options.error ?? defaultError) } }
方案3:使用typeof类型守卫
通过检查errorFn的类型是否为函数,实现类型缩小,仅需少量精确断言而非as any:
const defaultError = 'error' type Options = { error: string } | { errorFn: () => string } | {} function parse(options: Options = {}) { return { errorFn: typeof (options as { errorFn?: () => string }).errorFn === 'function' ? options.errorFn : () => (options as { error?: string }).error || defaultError } }
以上方案均无需as any断言,保持了类型安全性,同时代码简洁度和原方案相当。
内容的提问来源于stack exchange,提问作者TrevTheDev
相关产品推荐
相关产品推荐

