【问题标题】:Why doesn't Typescript error generic union type?为什么 Typescript 不会错误泛型联合类型?
【发布时间】:2019-08-01 20:14:07
【问题描述】:
interface Foo<T extends 'fo' | 'foo'> {
bla: T extends 'whyNoError?' ? string : number;
}
预期行为:查看类似内容:
'whyNoError' 值永远不会发生
实际:没有错误。
既然我指定 T 扩展 'fo' 或 'foo',为什么 Typescript 不将 'whyNoError' 值识别为从不或始终为假?
【问题讨论】:
标签:
typescript
generics
interface
extends
【解决方案1】:
因为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 !!
这不是一个非常令人满意的答案,因为可能没有人愿意支持这种愚蠢的交叉路口,但要点应该是,在不担心这种极端情况的情况下实现您所要求的并不是一件容易的事。
希望有所帮助;祝你好运!