首页 > 解决方案 > 如何在打字稿中定义函数类型,其变量参数名称仅限于某些接口的键

问题描述

我想为接口定义一个 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

解决方案


推荐阅读