打字稿:为他的孩子指定一个 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.
的任何方法之前
问题
我想创建一个 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.