给出这个简化的例子:
type OnlyBlue<T> = T extends 'blue' ? 'blue' : null
function parseBlue<Color extends 'red' | 'green' | 'blue'>(input: Color): OnlyBlue<Color> {
if (input === 'blue') {
const output = input
return output
}
return null
}
为什么我在返回语句中遇到类型错误?
由于某种原因,
input
没有被缩小到条件内的 blue
。有谁知道为什么吗?
这就是 TS 向我展示的
output
的类型:
我以为只是
'blue'
如何缩小范围?
打字稿5.5.2
我建议创建一个函数工厂,以便您可以创建任何颜色解析并使用带有类型保护的函数覆盖:
type Color = 'red' | 'green' | 'blue';
function makeColorParser<C extends Color>(color: C) {
const isColor = (input: Color, color: Color): input is C => input === color;
return parse;
function parse<I extends C>(input: I): I;
function parse<I extends Color>(input: I): null;
function parse<I extends Color>(input: I): null | C{
return isColor(input, color) ? input : null;
}
}
const parseBlue = makeColorParser('blue');
const blue = parseBlue('blue'); // blue
const red = parseBlue('red'); // null
const some = parseBlue('yellow'); // error, no yellow in Colors