为什么 Typescript 不会错误泛型联合类型?

Why doesn't Typescript error generic union type?

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

预期行为:看到类似的内容:

'whyNoError' value will never happen

实际:没有错误。

既然我指定 T 扩展 'fo' 或 'foo',为什么 Typescript 不将 'whyNoError' 值识别为 never 或总是 false?

因为 conditional types 我猜不是这样的吧?在该条件类型的 string 部分出现 "unreachable code" 错误是一个有趣的建议,但我无法想象有人会非常关心实现它。

从技术上和迂腐的角度来说,我可以指出 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 !!

这不是一个非常令人满意的答案,因为可能没有人愿意支持这种愚蠢的交叉点,但要点应该是,在不担心这种边缘情况的情况下实现您所要求的内容并非易事。

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