如何解决打字稿索引签名类扩展类
我尝试使用 Typescript 构建块编辑器。我的问题如下...
我有这个:
class A {...}
class B extends A {...}
class C extends A {...}
class D {...}
interface AConstructable {
new (): A;
}
interface AElements {
[name: string]: AConstructable
}
enter code here
const test: AElements = {
blockB: B // ??? this takes B,but have type A :/
}
我需要这个:
const test: AElements = {
blockB: B // ok!
blockC: C // error
}
const x1 = new test['blockB'](...) // return B class instance
我尝试了不同的方法,上面最接近,但我不知道如何咬它。可能吗?
解决方法
在打字稿中,任何扩展类型的东西都可以分配给该类型。您要求 AElements
的每个属性都是一个返回 A
的构造函数。返回 B
或 C
没有问题,因为所有 B
和 C
也是 A
。
您在 blockC
上出错的唯一原因是缺少逗号。这段代码实际上很好:
const test: AElements = {
blockB: B,blockC: C
}
但该代码仍会将 new test.blockB()
构造的值显示为 A
,因为我们没有保留有关属性的任何个人信息。
为了保留各个属性值的类型,同时强制它们扩展 A
,您可以通过标识函数创建 test
。使用函数允许推断 blockB
和 blockC
的确切类型并保留它们,同时还要求对象符合索引签名。
const checkObject = <T extends {}>(obj: T & AElements): T & AElements => obj;
const test = checkObject({
blockB: B,blockC: C
});
const x1 = new test['blockB']() // return B class instance
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。