首页 > 解决方案 > 为什么 Typescript 不会错误泛型联合类型?

问题描述

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

预期行为:见类似:

'whyNoError' 值永远不会发生

实际:没有错误。

既然我指定 T 扩展 'fo' 或 'foo',为什么 Typescript 不将 'whyNoError' 值识别为从不或始终为假?

标签: typescriptgenericsinterfaceextends

解决方案


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

从技术上和学究上讲,我可以指出这T可能是一个交集 '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 !!

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

希望有帮助;祝你好运!


推荐阅读