Typescript 将泛型类型属性筛选为特定类型

Typescript 将泛型类型属性筛选为特定类型,typescript,Typescript,我试图找到一种方法告诉TypeScript的编译器,值是泛型类型的键(深呼吸),如果应用于该类型的对象,将产生特定类型的属性。我知道这句话很让人困惑,所以这里有一个具体的例子 const obj:T=类型为T的对象; const key:KeysMatching=与'typeof T[key]==U'匹配的键; 常量属性=对象[key]; 在这里,我希望属性属于U类型,或者可以分配给U类型 我从TypeScript的文档中提供的类型中得到了灵感,尝试使用中建议的类型,该类型似乎非常适合我的情况

我试图找到一种方法告诉TypeScript的编译器,值是泛型类型的键(深呼吸),如果应用于该类型的对象,将产生特定类型的属性。我知道这句话很让人困惑,所以这里有一个具体的例子

const obj:T=类型为T的对象;
const key:KeysMatching=与'typeof T[key]==U'匹配的键;
常量属性=对象[key];
在这里,我希望
属性
属于
U
类型,或者可以分配给
U
类型

我从TypeScript的文档中提供的类型中得到了灵感,尝试使用中建议的类型,该类型似乎非常适合我的情况(但显然不适合),最后尝试创建自己的助手来过滤某些类型的属性:

type KeysMatching=T[keyof T]扩展U?基特:永远不会;
目前,在我的自定义解决方案中,
属性的类型是
T[T[keyof T]扩展了U?keyof T:never]
,并且不能分配给
U

有没有办法实现我想做的事情

我试图给出一个最小的可重复案例,但如果您需要更多信息、上下文或真实案例示例,请随时询问


提前感谢任何能给我一些想法或解决方案的人。

当您在条件类型typescript中使用泛型类型参数时,只要其中仍有未解析的类型参数,脚本就无法对其进行太多推理。这就是为什么从泛型类/函数的外部来说,事情会像预期的那样工作,但在内部,如果泛型类型仍然未知,编译器将不允许您对此类类型做太多操作:

type KeysMatching<T, V> = { [K in keyof T]: T[K] extends V ? K : never }[keyof T];

function test<T, K extends KeysMatching<T, string>>(o: T, k: K): T[K] {
    let v = o[k];

    v.toLowerCase() // error 
    return v;
}
test({ a: ""}, "a").toLowerCase() // ok from outside

这确实有局限性,例如intelisense不显示对
K

的建议这是函数或类上下文中的泛型类型吗?感谢您的澄清!我认为a不能在我的情况下使用您的变通方法,因为我需要我的类型来允许其他属性。这一次我可能会坚持使用像U一样未知的糟糕的
。@EnzoBaldisserri上面的选项将允许额外的属性,它只会将
K
指定的属性约束为
string
哦,好的,我没有意识到这一点。那我就想办法把它装进去。谢谢!
function test<T extends Record<K, string>, K extends PropertyKey>(o: T, k: K): T[K] {
    let v = o[k];
    v.toLowerCase(); //ok
    return v
}