У меня двоякий вопрос:
- Я хотел бы знать, есть ли в TypeScript способ ограничить универсальный тип каким-либо буквальным типом. Я имею в виду что-то вроде
function foo<T is a string literal>(...)
. Ближе всего к такому поведению я подошелfunction foo<T extends string>
, но это позволяет объединять строковые литералы и сам тип "строка" в качестве значений для T. - Если это невозможно в TypeScript 2.1, имеет ли смысл с точки зрения дизайна реализовать такую функцию?
Мой вариант использования - определить каррированную функцию prop
следующим образом:
function prop<K extends string, U>(name: K): <T extends { [P in K]: U }>(obj: T) => T[K] {
return (obj) => obj[name];
}
prop<'name', number>("name")({
name: 3
})
Этот пример работает так, как ожидалось, если K
является строковым литералом, но проверка типов функции разбивает K
string
.
Я знаю, что это немного надумано; пожалуйста, не моя цель - не решить практическую проблему (хотя это могло бы быть), а скорее поэкспериментировать с системой типов TypeScript.
Спасибо!