【发布时间】:2021-01-22 23:54:45
【问题描述】:
标题说明了一切,但最好举个例子。
interface A {
key1: string
key2: string
key3: number
}
type KeysOfType<O, T> = keyof {
[K in keyof O]: O[K] extends T ? O[K] : never
}
function test<O,T>(obj: O, key: KeysOfType<O,T>) {
obj[key] // should only be of type T
}
const aa: A = {
key1: "1",
key2: "2",
key3: 3
}
test<A,string>(aa, "key1") // should be allowed, because key1 should be a string
test<A,string>(aa, "key3") // should NOT be allowed (but is), because key3 should be a number
但是,这允许任何keyof 接口A。 (即,上述两个调用都是有效的)。
可以用打字稿来做到这一点吗?
【问题讨论】:
-
简而言之,是的,您的答案是正确的。但是,我希望输入也能在函数内部工作(即 obj[key] 将被推断为类型 T),但事实并非如此。我可以看到这是不可能的或支持的,因为它有点复杂。类型系统需要知道
key只会从obj中提取T类型的值。
标签: typescript