代码之家  ›  专栏  ›  技术社区  ›  Wilhelmina Lohan

if块作用域类型不通过泛型反射

  •  0
  • Wilhelmina Lohan  · 技术社区  · 6 年前
    class Foo {
      asdf: string;
    }
    
    class Bar {
      qwerty: number;
    }
    
    export type EntityTypeName = 'Foo' | 'Bar';
    
    export type EntityType = Foo | Bar;
    
    export type EntityTypeByName<N> =
      N extends 'Foo' ? Foo :
      N extends 'Bar' ? Bar :
      any;
    
    class Wrapper <N extends EntityTypeName = EntityTypeName, T extends EntityType = EntityTypeByName<N>> {
      entityTypeName: N;
      entity: T;
    }
    
    const wrapper1 = new Wrapper<'Foo'>();
    
      wrapper1.entityTypeName; // "Foo"
      wrapper1.entity; // Foo
    
    const wrapper2 = new Wrapper();
    
    if (wrapper2.entityTypeName === 'Foo') {
      wrapper2.entityTypeName; // "Foo"
      wrapper2.entity; // Foo | Bar (expect Foo)
    }
    

    https://stackblitz.com/edit/typescript-sqd5uf

    我希望第39行能显示类型 Foo 因为它位于从第37行开始的if块中,并且因为 T 在第25行 EntityTypeByName<N> 定义了第20行。有没有办法完成第39行显示的类型 ?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Matt McCutchen    6 年前

    wrapper2 是一个 Wrapper<"Foo" | "Bar", Foo | Bar> wrapper2.entityTypeName "Foo" 但是 wrapper2.entity Bar . 捕捉 entityTypeName entity

    type Wrapper<N extends EntityTypeName = EntityTypeName> =
      {[P in N]: {entityTypeName: P, entity: EntityTypeByName<P>}}[N];
    
    let wrapper1: Wrapper<'Foo'>;
    
      wrapper1.entityTypeName; // "Foo"
      wrapper1.entity; // Foo
    
    let wrapper2: Wrapper;
    
    if (wrapper2.entityTypeName === 'Foo') {
      wrapper2.entityTypeName; // "Foo"
      wrapper2.entity; // Foo
    }