如何使函数只接受Map到特定类型的键?
type Foo = {
// Arbitrary, can be any type
foo: number;
bar: number;
baz: string;
}
function f<T>(obj: T, key: keyof T) {
const foo = obj[key] // foo should be type number
}
const x: Foo = {foo: 0, bar: 1, baz: "a"}
f(x, "foo") // OK
f(x, "bar") // OK
f(x, "baz") // Should give error, because x["baz"] is not of type number
我试过扩展T,但无法让它使用参数中的密钥:
function f<T extends {key: number}>(obj: T, key: keyof T) {} // Doesn't work
我也试过从Foo中提取所有的数字字段,并取其中的key,但Extract似乎并不以这种方式工作:
function f<T>(obj: T, key: keyof (Extract<T, number>))) {} // Also doesn't work
这在TypeScript中可能吗?
连接至Playground
1条答案
按热度按时间eyh26e7m1#
有趣的问题!设法解决了这个难题。是的,可以在conditional types的帮助下完成,但要振作起来,这是相当复杂的: