【发布时间】:2019-11-23 07:07:36
【问题描述】:
假设以下对象是使用指定的类型定义创建的。它必须使用索引签名[key: string],因为允许对象有任何键,甚至根本没有键。
interface CreateObject {
[key: string]: {
foo: string
bar: number
}
}
const myObject: CreateObject = {
fooKey: {
foo: "something",
bar: 1
},
barKey: {
foo: "something else",
bar: 2
}
}
现在,假设我想创建一个接收key 参数的函数。 key 的值应该等于 myObject 中的实际键值,即在上面的示例中,key 应该永远等于 fooKey 或 barKey。
interface SomeFunction {
(key: keyof typeof myObject): void
}
const someFunction: SomeFunction = (key) => {
console.log(myObject[key].foo)
}
这不起作用,因为keyof typeof myObject 等于[key: string],因此只要someFunction(key) 中的key 等于任何字符串,就不会出现任何类型错误。
如何确保只有myObject 中的实际键可以作为key 参数传入?例如:
someFunction("fooKey") // should pass
someFunction("barKey") // should pass
someFunction("notAValidKey"); // should fail
这里有一个 Playground link 来演示这个问题。
【问题讨论】:
标签: typescript