考虑以下 TypeScript:(Playground)
type Settings = {
stringVal: string,
nestedVal: { boolVal: boolean }
// ... lots more properties ...
}
declare const settings: Settings
const settingGetters: { [prop: string]: (s: Settings) => any } = {
"string value": s => s.stringVal,
"boolean value": s => s.nestedVal.boolVal,
// ... lots more getters ...
}
const val = settingGetters["boolean value"](settings)
我希望 val
的类型为 boolean
,因为它调用了布尔值的 getter。然而,它实际上是类型 any
,因为 getter 被声明为总是返回类型 any
。
当我写 any
时,我不想将函数声明为实际返回 any
;相反,我希望 TypeScript 从函数定义本身推断实际类型。显然,使用 any
不是正确的方法。
通过单独声明每个 getter 的参数类型来解决这个问题很简单:
const settingGetters: {
"string value": (s: Settings) => s.stringVal,
"boolean value": (s: Settings) => s.nestedVal.boolVal,
// ...
}
但是,会有很多 getter,我希望避免为每个 getter 显式键入参数类型。我更愿意将参数类型与整个对象的单一类型统一起来。
如何定义混合了手动定义类型和推断类型的类型?