这样排除 get 为什么不行呢?如何修改?
interface ID {
[parentName: string]: any
add: () => number
}
如果你想创作一个受限的自定义对象类型,可以用 Record<Keys, Type>。阅读:https://www.typescriptlang.org/docs/handbook/utility-types.html
type IDKeys = 'get' | 'set' | 'add'
type ID = Record<IDKeys, number | string>
一种简单的方案是使用
any
:如果无法接受,那就将化解类型冲突:
若是依然不合适的话,那就需要根据使用场景进行调整了。
更新:
更新二:
你要先了解一点,就是为什么会报错,这里放一个简单的例子来说:
为什么这个接口
T
会报错?因为a
和[k]
不兼容,两者的返回值不一样。[k: string]: string
所做的,就是列举所有string
类型的key
,它们的返回值是string
,然而此时typeof a === 'string'
,其 返回值却是number
,所以不成立。回到你的场景,不要看都是
number
结尾,对于get
来说,它的名是string
,但值是一个function
。如果你需要兼容,那么可以将
get
或者[k]
设置为any
或never
(前文已提供)。不然在表现上,就很矛盾了:
题外话:
Map
泛型较为灵活,当然必要的判断少不了。