我正在研究一个带有两个类型参数的函数,T
并且K
. T
扩展Record
类型并且K
是第一种类型的键。有没有一种方法可以根据它的查找类型 ( T[K]
)来限制键类型T
?
我有以下类型:
type FormValue = string | number | boolean | null;
type FormValues = Record<string, FormValue>;
以及以下功能:
function numericFormHelperFunc<T extends FormValues, K extends keyof T>(key: K, formValues: T) {}
有没有一种方法可以限制哪些键可用于此功能,以便只允许formValues
具有查找类型的键number
?基本上是一种断言T[K] extends number
.
例如,如果我有这个示例表单类型:
type MyFormValues = {
name: string;
age: number;
numPets: number;
}
我可以添加类型限制numericFormHelperFunc
以便只有键"age"
和"numPets"
可以使用吗?
我正在寻找一种静态方法来执行此操作,以便我会收到有关尝试使用numericFormHelperFunc("name", myFormValues)
. 也想为打字稿知道,从仰视的价值key
在formValues
为特定类型的,而不仅仅是T[K]
(如使号码特定的方法和运算符可以不用类型的断言使用)。
这是解决方案:
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句