interface Foo<T extends 'fo' | 'foo'> {
bla: T extends 'whyNoError?' ? string : number;
}
预期的行为:看到类似的东西
'whyNoError'值永远不会发生
实际:没有错误。
由于我指定T扩展了'fo'或'foo',所以Typescript为什么不将'whyNoError'值标识为从不或始终为false?
答案 0 :(得分: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 !!
这不是一个很令人满意的答案,因为可能没有人希望支持这种愚蠢的交叉路口,但是可以得出的结论是,在不担心此类极端情况的情况下实现您所要的问题并不容易。
希望有所帮助;祝你好运!