是否可以将泛型类型约束为TypeScript中keyof的子集?

是否可以将泛型类型约束为TypeScript中keyof的子集?,typescript,typescript2.0,Typescript,Typescript2.0,在TypeScript的当前版本(2.1)中,我可以将泛型类上的方法参数约束为泛型类型的属性 class Foo<TEntity extends {[key:string]:any}> { public bar<K extends keyof TEntity>(key:K, value:TEntity[K]) { } } 编译器可以判断这是否可行 this.convert('s', 123, v => String(v)); 而这不会 this.conv

在TypeScript的当前版本(2.1)中,我可以将泛型类上的方法参数约束为泛型类型的属性

class Foo<TEntity extends {[key:string]:any}> {
    public bar<K extends keyof TEntity>(key:K, value:TEntity[K]) { }
}
编译器可以判断这是否可行

this.convert('s', 123, v => String(v));
而这不会

this.convert('n', 123, v => String(v));
我希望可以将
convertText
方法约束到值类型为
string
的键,以获得键参数的类型安全性。

这是可能的(这里使用非类示例)。下面将确保
T[P]
是一个字符串

function convertText<T extends {[key in P]: string }, P extends keyof T>(data: T, field: P & keyof T) {
    // ...
}

你问什么还不完全清楚。您是指
tenty
映射中的值吗?还是钥匙?你能编辑你的问题并给出你将如何使用它的例子吗?psuedo代码就是我将如何使用它的例子。它将给出一个错误,
this.model[key]
无法分配字符串,因为
TEntity[K]
未声明为字符串。不,没有办法这样做。编译器无法知道
TEntity[K]
是否为字符串,您将值定义为
any
,那么编译器如何知道呢?在类上工作得很好,但在接口上无法工作。KudozThat看起来像一组非常循环的约束。我很惊讶它能被解决。我们如何使用这个键来进行类似的约束?也就是说,func(field:keyof this)和这个[field]的类型是ClassA?我不知道为什么,但它确实在调用方工作。但是现在,在
convertText
函数中,如何让编译器知道obj['foo']=“some value”是完全有效的?现在我有一个编译错误,说
TS2322:Type'string'不能分配给Type'T[P&keyof T].
@altschuler也许你可以看看这个
this.convert('s', 123, v => String(v));
this.convert('n', 123, v => String(v));
function convertText<T extends {[key in P]: string }, P extends keyof T>(data: T, field: P & keyof T) {
    // ...
}
let obj = { foo: 'lorem', bar: 2 };
convertText(obj, 'foo');
convertText(obj, 'bar'); // fails with: Type 'number' is not assignable to type 'string'.