Try flow link.Возможно ли уточнить ограниченный полиморфный тип?
Вот простой пример ограниченного полиморфизма, который не работает так, как я ожидаю, что это:
// @flow
function thisBreaks<T: 'a' | 'b'>(x: T): T {
if (x === 'a') {
return 'a'
} else {
return 'b'
}
}
function thisWorks<T: 'a' | 'b'>(x: T): T {
return x
}
const a = 'a'
const aPrime: 'a' = thisWorks(a)
const b = 'b'
const bPrime: 'b' = thisWorks(b)
5: return 'a'
^string. This type is incompatible with the expected return type of
3: function thisBreaks<T: 'a' | 'b'>(x: T): T {
^some incompatible instantiation of `T`
7: return 'b'
^string. This type is incompatible with the expected return type of
3: function thisBreaks<T: 'a' | 'b'>(x: T): T {
^some incompatible instantiation of `T`
я ожидал бы первый пример для работы, так как, например, x === 'a'
чек может усовершенствовать T
до 'a'
, правильно?
Хотя это невозможно, вы можете выполнить то, что хотите делать с функцией пересечения. Я создал рабочий тип для вашей функции: [Попробуйте ссылку потока] (https://flow.org/try/#0PQKgBAAgZgNg9gdzCYAoVBjOA7AzgFzCjjgC4wAKCgD3IHIBDOgSjAF4A+MRl1MfgQIBklGvQBGLdlzqTmqNqOrSwytuu5MwAfk10wEluQbYAnvMw4CYcQwBO9LYuJwKPeVjyFbAL0PsiEjc5Sy8iBgBLGFxHfWcg2V4gA) – Andy