我几周前开了一个关于条件映射类型和泛型类型参数的issue on TypeScript。我试图定义映射类型import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
x_gal = np.random.rand(20)
y_gal = np.random.rand(20)
x_rand = np.random.rand(5*20)
y_rand = np.random.rand(5*20)
plt.figure(1)
plt.plot( x_gal, y_gal, ls=' ', marker='o', markersize=5, color='r' )
plt.plot( 0.5, 0.5, ls=' ', marker='o', markersize=5, color='r' )
plt.plot( x_rand, y_rand, ls=' ', marker='o', markersize=5, color='b' )
plt.axis('off')
plt.axis('equal')
circle1 = plt.Circle((0.5, 0.5), 0.2, color='r', alpha=0.5)
plt.gcf().gca().add_artist(circle1)
plt.tight_layout()
plt.show()
,它类似于泛型类型的SubAddsNewPropsToSuper<Sub, Super>
约束,除了它只允许Sub向Super添加新属性而不更改任何现有类型属性
也许这个问题被忽略或者被认为是一个问题(它没有任何标签设置而且没有关闭)。所以我想,我把它放在这里作为一个问题(问题是,如果可以定义这样的类型)。首先是我的代码示例,第二个是预期的行为,第三个是实际行为。我还在底部添加了一个游乐场链接。
extends
预期行为
类型// defines a type that contains all properties of Super exactly as they are defined in Super
// and all properties of Sub that are not already defined in Super.
type SubAddsNewPropsToSuper<Sub, Super> = { [KeyOfNewPropsInSub in Exclude<keyof Sub, keyof Super>]: Sub[KeyOfNewPropsInSub] } & Super;
class Controller<TModel> {
constructor(public model: SubAddsNewPropsToSuper<TModel, { Title: string }>) { }
setFancyTitle() {
this.model.Title = "FANCY"; // works
this.updateModel({ Title: "FANCY" }); // does not work - why?
const x: Partial<SubAddsNewPropsToSuper<{ Title: "Foo" }, { Title: string }>> = { Title: "FANCY" }; // works
const y: Partial<SubAddsNewPropsToSuper<TModel, { Title: string }>> = { Title: "FANCY" }; // does not work - why?
}
updateModel(changes: Partial<SubAddsNewPropsToSuper<TModel, { Title: string }>>) {
// merge "changes" into "this.model"
}
}
应该定义一个类型,其中包含SubAddsNewPropsToSuper<A, B>
完全类型的所有属性,因为它们在B
中定义,即使类型B
定义了具有不同类型的相同属性(例如,将属性的类型从A
更改为string
)。
如果"OnlyThisString"
被定义为Controller
,class Controller<TModel extends { Title: string }>{ ... }
可能实际上会更改属性类型TModel
,那么这背后的想法是绕过“问题”。
实际行为
如果Title
和A
都是非泛型类型,但如果B
是泛型类型,它就无效。
游乐场链接: link