В текущей версии (2.1) TypeScript я могу ограничить аргумент метода универсального класса свойством универсального типа.
class Foo<TEntity extends {[key:string]:any}> {
public bar<K extends keyof TEntity>(key:K, value:TEntity[K]) { }
}
Возможно ли в текущей системе типов ограничить ключевую часть еще больше, чтобы она была подмножеством, где значение ключа имеет определенный тип?
То, что я ищу, это что-то вроде этого псевдокода.
class Foo<TEntity extends {[key:string]:any}> {
public updateText<K extends keyof TEntity where TEntity[K] extends string>(key:K, value:any) {
this.model[key] = this.convertToText(value);
}
}
ИЗМЕНИТЬ
Для пояснения я добавил более полный пример того, чего я пытаюсь достичь.
type object = { [key: string]: any };
class Form<T extends object> {
private values: Partial<T> = {} as T;
protected convert<K extends keyof T>(key: K, input: any, converter: (value: any) => T[K])
{
this.values[key] = converter(input);
}
protected convertText<K extends keyof T>(key: K, input: any)
{
this.values[key] = this.convert(key, input, this.stringConverter);
}
private stringConverter(value: any): string
{
return String(value);
}
}
convertText
выдаст ошибку о том, что Type 'string' is not assignable to type 'T[K]'
.
Дано
interface Foo {
s: string
n: number
}
Компилятор может сказать, что это будет работать
this.convert('s', 123, v => String(v));
и этого не будет
this.convert('n', 123, v => String(v));
Я надеюсь, что смогу ограничить метод convertText
ключами, где значение имеет тип string
, чтобы обеспечить безопасность типов для ключевого параметра.
TEntity
? Или ключ? Можете ли вы отредактировать свой вопрос и привести пример того, как вы будете его использовать? - person Nitzan Tomer   schedule 17.01.2017this.model[key]
не может быть назначена строка, посколькуTEntity[K]
не объявлена как строка. - person opex   schedule 17.01.2017TEntity[K]
строкой или нет, вы определили значения какany
, так как же компилятор может знать? - person Nitzan Tomer   schedule 17.01.2017