如何将变量缩小为类型参数联合的子集?

问题描述 投票:0回答:1

给出这个简化的例子:

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
}

为什么我在返回语句中遇到类型错误?

  • 将鼠标悬停在

    return output
    上会显示此错误:

    enter image description here

  • 将鼠标悬停在

    return null
    上会显示此错误:

    enter image description here

由于某种原因,

input
没有被缩小到条件内的
blue
。有谁知道为什么吗?

这就是 TS 向我展示的

output
的类型: enter image description here

我以为只是

'blue'

如何缩小范围?

打字稿5.5.2

typescript
1个回答
0
投票

我建议创建一个函数工厂,以便您可以创建任何颜色解析并使用带有类型保护的函数覆盖:

游乐场

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
© www.soinside.com 2019 - 2024. All rights reserved.