【问题标题】:Access the instance type from a TypeScript static method从 TypeScript 静态方法访问实例类型
【发布时间】:2023-03-07 03:23:02
【问题描述】:

在基类的静态方法中,是否可以命名当前类的实例类型?

换一种说法,你能做这个代码类型检查吗:

class Base {
  static addInitializer(i: (v: any /* What type would go here? */) => void) {
    // implementation is irrelevent
  }
}

class Dog extends Base {
  bark() {}
}

class Fish extends Base {
  swim() {}
}

Dog.addInitializer((dog) => {
  dog.bark();
  // @ts-expect-error
  dog.swim();
});

Fish.addInitializer((fish) => {
  fish.swim();
  // @ts-expect-error
  fish.bark();
});

注意在应该是类型错误的行之前使用// @ts-expect-error。它们被突出显示为“未使用”,因为 v 的类型为 any,而不是我在此处尝试命名的类型。

TypeScript playground link

【问题讨论】:

    标签: typescript


    【解决方案1】:

    通过使静态方法通用并受静态方法的this 参数约束,您可以使调用静态方法的类的类型可用。从那里,只需使用 InstanceType 运算符,如下所示:

    class Base {
      static addInitializer<T extends new (...args: any) => Base>(this: T, init: (e: InstanceType<T>) => void) {
        // implementation is irrelevent
      }
    }
    
    class Dog extends Base {
      bark() {}
    }
    
    class Fish extends Base {
      swim() {}
    }
    
    Dog.addInitializer((dog) => {
      dog.bark();
      // @ts-expect-error
      dog.swim();
    });
    
    Fish.addInitializer((fish) => {
      fish.swim();
      // @ts-expect-error
      fish.bark();
    });
    

    【讨论】:

      猜你喜欢
      • 2016-02-25
      • 1970-01-01
      • 2020-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-05
      • 2015-01-30
      • 1970-01-01
      相关资源
      最近更新 更多