Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何让Typescript检查对象[键]是否为特定类型?_Typescript_Types_Typescript Generics - Fatal编程技术网

如何让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

假设我有这样一个Typescript函数:

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;
// }