打字稿:为他的孩子指定一个 parent class 类型

Typescript: Specify a parent class type to his childs

问题

我想创建一个 JSON object,它有 3 个 object(全部来自相同的 parent object)作为值。 而且,我想指定它们的类型。 我想用我的代码使用 parent class...

中的函数对 Intellisense help-me 执行此操作

示例:

abstract class Parent{
    function do_something() {...}
}

class child_1 extends Parent{}
class child_2 extends Parent{}
class child_3 extends Parent{}

// Now the JSON
const json: {[key: string]: /*WHAT_TO_PUT_HERE*/} = {
    'child_1': child_1,
    'child_2': child_2,
    'child_3': child_3,
}

我假设“JSON object”是指 JavaScript object,因为这就是您的示例代码所包含的内容。我还假设您希望 object 中的每个值都成为 child class 之一的 实例 而不是 class本身。

TypeScript 应该已经推断出您的 json object 的类型,如果您将编辑器配置为使用 TypeScript 的语言服务器,您将获得针对每个值的方法的 IntelliSense 建议object.

这里是您示例的清理版本,用于演示:

abstract class Parent {
  parentMethod() {}
}

class Child1 extends Parent {
  child1Method() {}
}

const children = {
  child1: new Child1(),
};

// Both of these methods on `child1` will be suggested by Intellisense
children.child1.parentMethod();
children.child1.child1Method();

如果您想强制 object 中的每个值都是 Parent,您可以这样输入:

const children: { [index: string]: Parent } = {
  child1: new Child1(),
  child2: new Child2(),
  child3: new Child3(),
};

但是,如果您这样做,您将只能访问 child1 属性 上 Parent 的方法,因为您输入了 属性 作为 Parent 而不是 Child.

如果您不想将每个 属性 的类型扩展到 Parent,您必须将索引类型指定为所有可能 children 的联合:

const children: { [index: string]: Child1 | Child2 | Child3 } = {
  child1: new Child1(),
  child2: new Child2(),
  child3: new Child3(),
};

如果您使用这种形式,您可以在 object 的任何属性上调用 Parent 中的方法,但您需要使用类型保护来检查具体 class 每个 属性 是在使用特定于特定 child class.

的任何方法之前