我正在寻找的行为可以通过重载来实现:
function fun(elType: "input", params: Input): number;
function fun(elType: "swtich", params: Switch): number;
function fun(){
return 2
}
如果我在哪里运行:
fun("swtich", SOMETHING_OF_SHAPE_SWITCH) //compiles
fun("input", SOMETHING_OF_SHAPE_INPUT) // error
fun("input", SOMETHING_OF_SHAPE_INPUT) //compiles
我想知道是否可以通过直接检查参数来完成:
interface Input {
a: 2
}
interface Switch {
b: 2
}
type ElType = {
input: Input,
switch: Switch,
}
const fun = <T extends keyof ElType>(elType: keyof ElType, params: ElType[typeof elType]) => { }
这和我一样接近,但它允许两者:
fun("input", {
b: 2
})
fun("input", {
a: 2
})
看来我很接近了,但我 a) 不太确定最后一个示例中发生了什么,并且 b) 不确定如何实现所需的行为。
看来我想做的是:
const fun = <T extends keyof ElType>(elType: keyof ElType, params: ElType[elType]) => {}
但我得到了错误:type 'elType' cannot be used as an index type.
我已经看到几个库实现了这种模式,所以我想知道最惯用的方法是什么。
回答1
您已经定义了通用 T
但还没有使用它! TypeScript 不知道如何处理它,所以它忽略了它。
<T extends keyof ElType>(elType: T, params: ElType[T]) => ...
在这里使用它允许 TypeScript 从 elType
推断 T
是什么,并且一旦它知道 T
是什么,您就可以使用 ElType[T]
来获取正确的参数。