TypeScript 在使用instanceof在带有可选字段的模板类上时,出现了奇怪的缩小,

2jcobegt  于 4个月前  发布在  TypeScript
关注(0)|答案(1)|浏览(62)

Bug报告

当使用instanceof为具有可选字段的泛型类时,TypeScript在类型上缩小错误

🔎 搜索词

typescript instanceof模板可选缩小

🕗 版本与回归信息

似乎该bug存在于所有版本中:旧版、实际版和夜间版

⏯ Playground链接

https://www.typescriptlang.org/play?target=8&ts=4.8.0-dev.20220602#code/MYGwhgzhAECiA8sB80DeAoaXoFMD8AXHANzoC+66okMAgvAJIo4AeALjgHYAmMCTGbNABmASxwhuRTgFcAtgCMcAJ2gBeaAAZSFKuCjRaARkbN2XXodNpM2MRO5HC0WYpU7K1A7QBM11hw8dNaCduKSRtLySqoaRh7owjKcwGyiAPacIqYAFGBE9K4xSACUNkKiwtB50KKcEGxgKTjpVcZloUJYYAB09hGkQhQVVTV1DU3ALW0+HbZd0L39joPYFBRAA

💻 代码

class E<E> {
    e?: E;
}

class A<I> extends E<I>{
    field: number = 0;
}

class A1<I> extends A<I> {
    field1?: number;
}

class A2<I> extends A<I> {
    field1: number = 1;
}

function f<I>(a: A<number>) {
    if (a instanceof A1) {
        a.field1;
    }
    if (a instanceof A2) {
        a.field1;
    }
}

🙁 实际行为

在第一个if中,属性'field1'不存在于类型A中,变量a缩小到A

🙂 预期行为

在第一个if中,变量a缩小到A1,并且属性field1存在

ffscu2ro

ffscu2ro1#

简化后的文本内容为:

class Base<I>  {
    e?: I;
}

class A1<I> extends Base<I> {
    field_A1?: number;
}

class A2<I> extends Base<I> {
    field_A2!: number;
}

function f(a: Base<number>) {
    if (a instanceof A1) {
        a.field_A1; // Not present, should be
    }
    if (a instanceof A2) {
        a.field_A2; // Correctly present
    }
}

我有点惊讶这个错误从3.3.3版本开始就一直存在,而且据我所知没有其他报告。

相关问题