为什么Typescript不会错误显示通用联合类型?

时间:2019-03-11 13:40:27

标签: typescript generics interface extends

interface Foo<T extends 'fo' | 'foo'> {
  bla: T extends 'whyNoError?' ? string : number;
}

预期的行为:看到类似的东西

  

'whyNoError'值永远不会发生

实际:没有错误。

由于我指定T扩展了'fo'或'foo',所以Typescript为什么不将'whyNoError'值标识为从不或始终为false?

1 个答案:

答案 0 :(得分:2)

我猜是因为conditional types不能那样工作?在该条件类型的string部分出现“无法访问的代码”错误是一个有趣的建议,但是我无法想象有人会非常在意实现它。

从技术和方法上讲,我可以指出T可能是intersection 'fo' & 'whyNoError?',尽管它是一种荒谬的类型,最终会减少为never,但确实会导致编译器的路径可能会让您感到惊讶:

interface Foo<T extends 'fo' | 'foo'> {
  bla: T extends 'whyNoError?' ? string : number;
}
declare const foo: Foo<'fo' & 'whyNoError?'>;
const str = foo.bla; // string !!

这不是一个很令人满意的答案,因为可能没有人希望支持这种愚蠢的交叉路口,但是可以得出的结论是,在不担心此类极端情况的情况下实现您所要的问题并不容易。

希望有所帮助;祝你好运!