TypeScript使用Symbol作为接口索引键时参数类型不符合预期如何解决
错误原因
你定义的[k: symbol]: (e: string) => void属于通用symbol索引签名,TS当前的类型推导规则不会自动将该签名的类型关联到具体字面量Symbol作为键的属性上,因此obj中[S]对应的函数参数无法继承到string类型,触发隐式any报错。
解决方法
方案1:将用到的Symbol声明为接口的固定属性(最推荐)
直接把你定义的SymbolS作为接口的明确键,TS就能正确推导属性类型:
const S = Symbol() interface test { [S]: (e: string) => void; } const obj: test = { [S]: (data) => { console.log(data) } }
此时data会自动被推导为string类型,无报错。
方案2:保留通用索引签名,手动指定参数类型
如果你的接口确实需要支持任意symbol作为键,可以直接给函数参数加类型标注:
interface test { [k: symbol]: (e: string) => void; } const S = Symbol() const obj: test = { [S]: (data: string) => { console.log(data) } }
方案3:复用索引签名的函数类型推导参数
如果不想手动写死参数类型,可以从索引签名中提取对应类型复用:
interface test { [k: symbol]: (e: string) => void; } type SymbolMethodType = test[symbol] const S = Symbol() const obj: test = { [S]: (data: Parameters<SymbolMethodType>[0]) => { console.log(data) } }
内容的提问来源于stack exchange,提问作者missannil
相关产品推荐
相关产品推荐

