typescript - 获取一个参数的value,使其成为另一个参数的类型

我正在寻找的行为可以通过重载来实现:

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.

https://www.typescriptlang.org/play?#code/JYOwLgpgTgZghgYwgAgJIgA4FczIN4BQyycAXMgEwEC%20BBoksiKAygO7BgIAW%20RyAI3JVaBMAE8MKAKIAbACqSUAXj7FQ2MOXSaANPwDOHLt3LtOPfaIQB7EAdwwsIZKoA885BAAekEABMDZABrCHEbGGQ5RSkAPgAKCAUlclDwyOilXWQMOCg4AFsDckypAG0kmIgAXQBKV1i%20GjonEHiAIg0cduzCYiFKGlqW5wQwYDtkVopE5KlyTsxu7Nz8ou0lsFryECwCgWgAbgJWsYmXadmqhaNxnh6cvMLi5HMTbeRd-aOT0fHJy61PrIKAQMBYKAuEQjEAzdq3YD3XoDCjUYZiJRoADyADdoLIbHB-K41MRkFcUshFpoHqtnhtNB8vgcoMcyeTKpT4cYkY81i83jwmXsWcdrHYHFNnABmbS4-GE4mqeJ0grkOAgcT1ZSNYHEUHgyGUMUw6UdLpgB7AsiDNFAA

我已经看到几个库实现了这种模式,所以我想知道最惯用的方法是什么。

回答1

您已经定义了通用 T 但还没有使用它! TypeScript 不知道如何处理它,所以它忽略了它。

<T extends keyof ElType>(elType: T, params: ElType[T]) => ...

在这里使用它允许 TypeScript 从 elType 推断 T 是什么,并且一旦它知道 T 是什么,您就可以使用 ElType[T] 来获取正确的参数。

相似文章