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

问题描述 投票:1回答:1
interface Foo<T extends 'fo' | 'foo'> {
  bla: T extends 'whyNoError?' ? string : number;
}

预期行为:看到类似于:

'whyNoError'值永远不会发生

实际:没有错误。

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

typescript generics interface extends
1个回答
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 !!

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

希望有所帮助;祝好运!

© www.soinside.com 2019 - 2024. All rights reserved.