TypeScript:条件映射类型和通用类型参数

时间:2018-05-23 18:45:53

标签: typescript

我几周前开了一个关于条件映射类型和泛型类型参数的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"被定义为Controllerclass Controller<TModel extends { Title: string }>{ ... }可能实际上会更改属性类型TModel,那么这背后的想法是绕过“问题”。

实际行为 如果TitleA都是非泛型类型,但如果B是泛型类型,它就无效。

游乐场链接: link

0 个答案:

没有答案