interface Foo<T extends 'fo' | 'foo'> {
bla: T extends 'whyNoError?' ? string : number;
}
预期行为:看到类似于:
'whyNoError'值永远不会发生
实际:没有错误。
由于我指定T扩展为'fo'或'foo',为什么Typescript将'whyNoError'值标识为never或始终为false?
因为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 !!
这可能不是一个非常令人满意的答案,因为可能没有人愿意支持这种愚蠢的交叉点,但应该注意的是,在不担心这种边缘情况的情况下实施您所要求的内容并非易事。
希望有所帮助;祝好运!