我有一个定义了值类型的对象:
type Type = { [key: string]: ValueType }
const variable: Type = {
key1: valueType,
key2: valueType,
key3: valueType,
}
我有一个函数 func
,我只想接受带有 variable
键值的字符串:
func('key1') // OK
func('key2') // OK
func('key3') // OK
func('keyother') // Error
func(3) // Error
这就是我在为 func
制作类型时所做的:
type FuncType = (param: keyof typeof variable) => any
const func: FuncType = ...
但我只能实现一个:
- 输入
变量
的值
或
- 输入
func
的param
只接受variable
的key
两者都不是。
- 如果我输入
变量
的值const变量:Type = {
,param
有string
输入,我可以将任何字符串传递给func
调用,这是错误的 - 如果我没有为
variable
的值const 变量键入:Type = {
,func
现在键入param
正确,但它使variable
接受任何值。
我可以考虑的另一种方法是使用键列表 ([key1, key2, ...]
) 预定义 Type
。但我不想维护同一事物的两个列表。如果不这样做,我怎么能同时实现这两个目标。
Typescript playground对于这个问题,里面有一些注释可以更清楚地描述问题。
最佳答案
您必须使用仅验证类型的辅助函数。
const makeType = <T extends Type = Type>(obj: T) => obj
const variable = makeType({
key1: 0,
key2: 0,
key3: 0,
})
更新:TypeScript 4.9 将使这成为可能 satisfies
Announcing TypeScript 4.9 Beta
const variable = {
key1: valueType,
key2: valueType,
key3: valueType,
} satisfies Record<string, ValueType>
关于typescript - Make 函数参数只接受来自变量对象的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71581951/