为什么 Typescript 不会错误泛型联合类型?
Why doesn't Typescript error generic union type?
interface Foo<T extends 'fo' | 'foo'> {
bla: T extends 'whyNoError?' ? string : number;
}
预期行为:看到类似的内容:
'whyNoError' value will never happen
实际:没有错误。
既然我指定 T 扩展 'fo' 或 'foo',为什么 Typescript 不将 'whyNoError' 值识别为 never 或总是 false?
因为 conditional types 我猜不是这样的吧?在该条件类型的 string
部分出现 "unreachable code" 错误是一个有趣的建议,但我无法想象有人会非常关心实现它。
从技术上和迂腐的角度来说,我可以指出 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 !!
这不是一个非常令人满意的答案,因为可能没有人愿意支持这种愚蠢的交叉点,但要点应该是,在不担心这种边缘情况的情况下实现您所要求的内容并非易事。
希望对您有所帮助;祝你好运!
interface Foo<T extends 'fo' | 'foo'> {
bla: T extends 'whyNoError?' ? string : number;
}
预期行为:看到类似的内容:
'whyNoError' value will never happen
实际:没有错误。
既然我指定 T 扩展 'fo' 或 'foo',为什么 Typescript 不将 'whyNoError' 值识别为 never 或总是 false?
因为 conditional types 我猜不是这样的吧?在该条件类型的 string
部分出现 "unreachable code" 错误是一个有趣的建议,但我无法想象有人会非常关心实现它。
从技术上和迂腐的角度来说,我可以指出 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 !!
这不是一个非常令人满意的答案,因为可能没有人愿意支持这种愚蠢的交叉点,但要点应该是,在不担心这种边缘情况的情况下实现您所要求的内容并非易事。
希望对您有所帮助;祝你好运!