根据 TypeScript 中的查找类型限制通用键类型

Hen*_*ody 3 generics types typescript typescript-generics

我正在开发一个带有两个类型参数的函数,T并且K. T扩展一个Record类型并且K是第一种类型的键。有没有办法可以根据其查找类型 ( T[K]) 来限制键类型T

我有以下类型:

type FormValue = string | number | boolean | null;

type FormValues = Record<string, FormValue>;
Run Code Online (Sandbox Code Playgroud)

以及以下函数:

function numericFormHelperFunc<T extends FormValues, K extends keyof T>(key: K, formValues: T) {}
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以限制哪些键可用于此功能,以便只允许formValues具有查找类型的键?number基本上是断言的一种方式T[K] extends number

例如,如果我有这个示例表单类型:

type MyFormValues = {
    name: string;
    age: number;
    numPets: number;
}
Run Code Online (Sandbox Code Playgroud)

我可以添加类型限制,以便仅可以使用numericFormHelperFunc"age"和吗?"numPets"

我正在寻找一种静态方法来执行此操作,以便我会收到有关尝试使用numericFormHelperFunc("name", myFormValues). 还希望打字稿知道查找的值keyformValues特定类型,而不仅仅是T[K](例如,可以在没有类型断言的情况下使用特定于数字的方法和运算符)。

cap*_*ian 7

这是解决方案:

type FormValue = string | number | boolean | null;

type FormValues = Record<string, FormValue>;

type MyFormValues = {
  name: string;
  age: number;
  numPets: number;
}

/**
 * Takes two arguments,
 * T - indexed type
 * Allowed - allowed types
 * 
 * Iterates through all properties and check
 * if property extends allowed value
 */
type Filter<T, Allowed> = {
  [P in keyof T]: T[P] extends Allowed ? P : never
}[keyof T]

function numericFormHelperFunc<T extends FormValues>(key: Filter<MyFormValues, number>, formValues: T) { }

numericFormHelperFunc('age', {'sdf':'sdf'}) // ok
numericFormHelperFunc('numPets', {'sdf':'sdf'}) // ok
numericFormHelperFunc('hello', {'sdf':'sdf'}) // error
numericFormHelperFunc('2', {'sdf':'sdf'}) // error
numericFormHelperFunc('name', {'sdf':'sdf'}) // error
Run Code Online (Sandbox Code Playgroud)