在TypeScript中,定义类型化函数参数类型

hrirmatl  于 2022-12-24  发布在  TypeScript
关注(0)|答案(1)|浏览(246)

让我们声明一个泛型函数:

const fun = <E = any, V = any>(params: { value: V; getValue: (e: E) => V; }) => { /**/ }

在另一个地方,我们有一个消费者代码,应该输入,现在它导致TS错误:

type E = { value: string };

type Params = Parameters<typeof fun>[0];

const run = (params: Params) => {

  // expecting params.value to be a string
  // TS2339: Property 'length' does not exist on type 'unknown'.
  if (params.value.length > 0) {

    // TS2345: Argument of type '{ value: unknown; getValue: (e: unknown) => unknown; }'
    // is not assignable to parameter of type '{ value: string; getValue: (e: E) => string; }'.
    //   Types of property 'value' are incompatible.
    //      Type 'unknown' is not assignable to type 'string'.
    fun<E, string>(params);
  }
};

有没有办法得到一个类型化函数的参数的类型,比如Params{ value: string; getValue: (e: E) => string },类似于Parameters<typeof fun<E,string>>[0]

i2byvkas

i2byvkas1#

如果我理解正确的话,您可以使Params类型成为泛型。
就像这样:

const fun = <E = any, V = any>(params: { value: V; getValue: (e: E) => V; }) => { /**/ }

type Params<E> = Parameters<typeof fun<E,string>>[0];

const run = function<E>(params: Params<E>) {
  if (params.value.length > 0) {
    fun<E, string>(params);
  }
};

相关问题