Typescript 扩展类的类型

Typescript 扩展类的类型,typescript,Typescript,我想键入一个变量,例如它的值必须是扩展基类的类的名称 class Base {} class Foo extends Base {} class Bar extends Base {} function myFunction(myObject: Base) { let objectTypeAsString: string = foo.constructor.name; } let foo = new Foo(); myFunction(foo); 这段代码是有效的,但是objectT

我想键入一个变量,例如它的值必须是扩展基类的类的名称

class Base {}
class Foo extends Base {}
class Bar extends Base {}

function myFunction(myObject: Base) {
  let objectTypeAsString: string = foo.constructor.name;
}

let foo = new Foo();

myFunction(foo);
这段代码是有效的,但是objectTypeAsString被类型化为string,我希望有一个更安全的类型。
我知道foo.constructor.name是在运行时获取的,但也许有一种更聪明的方法来定义和获取类名。

注意:我将向空类添加属性以避免


这实际上是不可能的,而且解决办法可能比它们的价值更麻烦。类实例的
构造函数
属性在TypeScript中不是强类型的,这是一个错误。构造函数的
name
属性也被键入为
string
。所以你必须试着手动做这些事情,这是乏味的,ans无法扩展

…编译器每次都会拒绝你。显然,您不能手动强键入类静态端的
名称
属性:

class Hmm {
  hmm = 123; 
  static readonly name: "Hmm"; // error!
  //              ~~~~
  // Static property 'name' conflicts with built-in property 
  // 'Function.name' of constructor function 'Hmm'.
}
即使您可以这样做,当您开始扩展类时,编译器也会非常生气:

class Hmm {
  hmm = 123;
  //@ts-ignore
  static readonly name: "Hmm";
}

class Oops extends Hmm // error!
//    ~~~~
// Class static side 'typeof Oops' incorrectly 
// extends base class static side 'typeof Hmm'.
{
  oops = 456;
  //@ts-ignore
  static readonly name: "Oops";
}
因为子类需要可分配给超类,但是
“Oops”
不能分配给
“Hmm”
。这意味着子类不一定是严格意义上的子类,但我们需要类似的东西。但是不能在静态属性中使用实例泛型类型参数,因此我们必须忘记类的静态方面


我们可以做的一件事是自己使用一个将在TS3.5中获得更多信息的

// this is now generic
class Base<N extends string = "Base"> {
  ["constructor"]: typeof Base & { name: N }; // strongly type "constructor"
  base = "b"; 
}
class Foo extends Base<"Foo"> {
  foo = "f";
}
class Bar extends Base<"Bar"> {
  bar = "b";
}

// this is now generic too
function myFunction<N extends string>(myObject: Base<N>): N {
  return myObject.constructor.name;
}

let foo = new Foo();

myFunction(foo); // "Foo"
//这现在是通用的
阶级基础{
[“构造函数”]:基的类型&{name:N};//强类型“构造函数”
base=“b”;
}
类Foo扩展了基{
foo=“f”;
}
类栏扩展了基{
bar=“b”;
}
//这现在也是通用的
函数myFunction(myObject:Base):N{
返回myObject.constructor.name;
}
设foo=newfoo();
myFunction(foo);//“福”
这一切都是可行的,但它是丑陋的。所以我猜简短的回答应该是“你不能这么做”,稍长的回答是“你可以稍微做一点,但你不应该”


哦,希望这会有帮助。祝你好运

目前不可能