如何在打字稿中定义函数类型,并且将可变参数名称限制为某些接口的键

时间:2019-02-15 13:00:14

标签: typescript

我想为接口定义一个Setter函数类型。 我希望它看起来像这样:

type ISetter<T, U extends keyof T> = (self: T, [s: U]: T[U])

但这会引发错误:

Type 'T[U]' must have a '[Symbol.iterator]()' method that returns an iterator 

这个想法是要有一个函数类型,其中参数名称限制为某些可能的值(对于Setter,它将是Setter所针对的接口的键)

我也尝试过:

type ISetter<T, U extends keyof T> = (self: T, [s: string]: T[U]) => T

错误:

Type 'T[U]' must have a '[Symbol.iterator]()' method that returns an iterator.ts(2488)

但是当我尝试时:

type ISetter<T, U extends keyof T> = (self: T, []: T[U]) => T // no error

这是可行的,但显然在这种情况下对参数名称没有限制。

这是一个用法示例:

export const setSku: ISetter<IProduct, "sku"> = (
  self: IProduct,
  sku: ISkuProjection
) => {
  return {} as IProduct
}
// sku is a key on the IProduct interface
// I want to restrict the argument names to [self and "sku"]

我该如何实现?甚至有可能在Typescript中使用?

0 个答案:

没有答案