如何让Typescript检查对象[键]是否为特定类型?
假设我有这样一个Typescript函数:如何让Typescript检查对象[键]是否为特定类型?,typescript,types,typescript-generics,Typescript,Types,Typescript Generics,假设我有这样一个Typescript函数: constmyfunction=(对象:U,键:V)=>{ // ... } 如何让Typescript检查对象[key]是否属于特定类型 例如,假设我希望object[key]的类型为“string” 因此,当我调用myFunction时,它应该是这样工作的: myFunction({keyA:hello',keyB:123},“keyA”)//OK myFunction({keyA:“hello”,keyB:123},“keyB”)//错误:`k
constmyfunction=(对象:U,键:V)=>{
// ...
}
如何让Typescript检查对象[key]
是否属于特定类型
例如,假设我希望object[key]
的类型为“string”
因此,当我调用myFunction
时,它应该是这样工作的:
myFunction({keyA:hello',keyB:123},“keyA”)//OK
myFunction({keyA:“hello”,keyB:123},“keyB”)//错误:`keyB`必须是string类型,但不是number
根据上一次的回答,我把这个工作示例放在一起,专门回答您的问题(),但困难的部分实际上来自另一个答案
type KeysMatching<T,V> = keyof { [ P in keyof T as T[P] extends V ? P : never ] : P };
function myFunction<T>(object: T, key: KeysMatching<T,string> ){
// ...
}
myFunction({keyA: "hello", keyB: 123}, "keyA") // OK
myFunction({keyA: "hello", keyB: 123}, "keyB") // error: `keyB` must be of type string but is number
顺便说一句,然后可以将此策略推广到相反的情况,并创建一个忽略值
类型
type OmitValues<T,V> = { [ P in keyof T as T[P] extends V ? never : P ] : T[P] }
type Omitted = OmitValues<{keyA: "hello", keyB: 123},string>;
// type Omitted = {
// keyB: 123;
// }
type-ommitvalues={[P在T[P]扩展V时的keyof T中?never:P]:T[P]}
类型省略=省略值;
//类型省略={
//密钥b:123;
// }
最后,它还可以重新调整用途,只提取具有可选性质的属性
type OptionalValues<T> = { [ P in keyof T as undefined extends T[P] ? P : never ] : T[P] }
type Optional = OptionalValues<{keyA?: "hello", keyB: 123}>;
// type Optional = {
// keyA?: "hello" | undefined;
// }
type OptionalValues={[P in keyof T as undefined extends T[P]?P:never]:T[P]}
类型可选=可选值;
//类型可选={
//keyA?:“你好”|未定义;
// }
这是一个非常鼓舞人心和富有挑战性的问题(尽管看起来非常简单)。它教会了我打字的新知识。从那以后,我一直在努力完善上面的答案。我发现构造实用程序类型PickValues和ommitvalues是解决问题和定义关键联合的好方法。我还发现我可以提取可选值。操场就在这里,它并没有真正改变答案,但用另一种方式写它帮助我更好地遵循解决方案。
type OptionalValues<T> = { [ P in keyof T as undefined extends T[P] ? P : never ] : T[P] }
type Optional = OptionalValues<{keyA?: "hello", keyB: 123}>;
// type Optional = {
// keyA?: "hello" | undefined;
// }