Definitions by:
index.d.ts
),以便他们可以回应。我将此问题创建为#11365、#11365 和#17846 的替换跟踪问题。
下表是跟踪与 D3 模块定义相关的改进/技术债务的表格。
strictNullChecks
和编译器选项设置为true
strictFunctionTypes
和编译器选项设置为true
| 定义| JS文档 | strictNullChecks
| strictFunctionTypes
| TS 2.3
|
| --- | --- | --- | --- | --- |
| d3 | 不适用 | 🔲 | 🔲 | ✅ |
| d3 数组| 🔲 | ✅ | 🔲 | 🔲 |
| d3轴| ✅ | ✅ | ✅ | ✅ |
| d3-brush | ✅ | ✅ | 🔲 | 🔲 |
| d3 和弦| ✅ | ✅ | 🔲 | 🔲 |
| d3-集合| ✅ | ✅ | ✅ | ✅ |
| d3色| 🔲 | ✅ | ✅ | ✅ |
| d3-轮廓| ✅ | ✅ | ✅ | 🔲 |
| d3-调度| ✅ | ✅ | ✅ | ✅ |
| d3-拖动| ✅ | ✅ | 🔲 | 🔲 |
| d3-dsv | ✅ | ✅ | 🔲 | 🔲 |
| d3-轻松| ✅ | ✅ | 🔲 | 🔲 |
| d3-fetch | ✅ | ✅ | 🔲 | 🔲 |
| d3-力| ✅ | ✅ | 🔲 | 🔲 |
| d3格式| ✅ | ✅ | ✅ | ✅ |
| d3-geo | ✅ | ✅ | ✅ | ✅ |
| d3-hexbin | 🔲 | 🔲 | 🔲 | 🔲 |
| d3-层次结构| 🔲 | 🔲 | 🔲 | 🔲 |
| d3-插值| 🔲 | 🔲 | 🔲 | 🔲 |
| d3 路径| ✅ | ✅ | 🔲 | 🔲 |
| d3-多边形| ✅ | ✅ | ✅ | ✅ |
| d3-四叉树| 🔲 | 🔲 | 🔲 | 🔲 |
| d3 队列| ✅ | 🔲 | 🔲 | 🔲 |
| d3-随机| ✅ | ✅ | 🔲 | 🔲 |
| d3-请求| 🔲 | 🔲 | 🔲 | 🔲 |
| d3-sankey | ✅ | ✅ | 🔲 | 🔲 |
| d3 尺度| ✅ | ✅ | 🔲 | 🔲 |
| d3-scale-chromatic | ✅ | ✅ | 🔲 | 🔲 |
| d3-选择| ✅ | ✅ | ✅ | 🔲 |
| d3-选择-多| ✅ | ✅ | 🔲 | 🔲 |
| d3型| ✅ | ✅ | 🔲 | 🔲 |
| d3-时间| ✅ | ✅ | 🔲 | 🔲 |
| d3-时间格式| ✅ | ✅ | 🔲 | 🔲 |
| d3-定时器| ✅ | 🔲 | 🔲 | 🔲 |
| d3-过渡| ✅ | ✅ | 🔲 | 🔲 |
| d3-voronoi | ✅ | 🔲 | 🔲 | 🔲 |
| d3-变焦| ✅ | ✅ | 🔲 | 🔲 |
核心团队维护的“外部”:
| 模块 | JS文档 | strictNullChecks
| strictFunctionTypes
| TS 2.3
|
| --- | --- | --- | --- | --- |
| d3-hsv | ✅ | ✅ | ✅ | ✅ |
@gustavderdrache @Ledragon上面我合并了几个未完成的任务以完成 D3 定义集的全部作品。
一个关键问题:我们是否希望将所有定义一致地升级为 TS >=2.3 约束,并在此过程中通过使用泛型的默认分配来删除一些函数/方法重载?
我注意到(无意中)一些定义在定义标题中已经有// TypeScript Version: 2.3
约束。 例如d3-geo ,它使用geoJson
定义。 这些已经使用通用默认值。
您对此事的想法将非常受欢迎。
明白这一点,你必须研究它
如果实现最低 TS 2.3,我们还应该能够在适当的情况下使用object
类型而不是any
。 附带 TS 2.2。 如果我没记错的话,对象插值器和 d3-collection 有一些机会。
第一个想法:
strictNullChecks
和strictFunctionTypes
的分支。 我会更新它并提交 PR。 我以为我做到了,但事实并非如此在对此有意见之前,我必须了解默认泛型:p
对于 TS 2.3,我们正在寻找 2017 年 4 月的版本。
TS 2.4 于 2017 年 6 月发布。
所以最大的问题是:当强制至少 2.4(而不是 2.3)时,我们是否会在安装基础的大部分或可忽略不计/没有部分产生问题?
我想增加的挑战之一是我们本身没有变更日志来标记对 D3 定义的使用方式的潜在破坏性更改。 并且明显的脱节,即在定义的次要版本发布中可能发生重大更改,因为它们与底层 D3 发布周期保持一致。
@gustavderdrache您对 TS 2.4 作为新的最低要求有何看法?
正如 PR #23654 中所见,当我们进入 TS 2.4 时,我们似乎会快速级联(即使它只是为了 DT 而施加约束,而不使用任何 TS 2.4 特性,如字符串枚举)。
根据新的 PR #23724,为了清楚起见,我们可以简单地使用 TS 2.3。 目前无需推进 TS 2.4。
@Ledragon如果您想打开您在本地d3-geo分叉中已经有待处理的 PR,那么我们可以检查上面的框。
我实际上无法在本地对其进行测试......所以我认为我可以提交它,但我认为它不会通过 travis 测试。 我先去看看
好的,所以问题如下: d3-geo
测试在 TS 2.3 中失败,所以我尝试将版本设置为 2.4。 但是, d3
global 设置为 TS 2.3,因此也不起作用。 关于如何进行的任何建议?
我将查看g3-geo PR 并将所有评论评论放在那里以保持他们的专注。 与我在d3-collection中遇到的 OoM 错误不同,我们有一个正确的错误消息可以处理 😄
刚刚提交 #24118 更新d3-contour
到 1.2.0
我注意到d3-contour
类型已经在TS2.3
中,并且strictNullChecks
和strictFunctionTypes
设置为 true :-)
感谢您对d3-contour 的关注,让我注意到出于某种奇怪的原因,我没有关于“观看”的回购。 改变了那个! :微笑:
稍后将查看 PR。
我正在研究 d3 轴和 d3 格式。 我马上就好。 但是有一些问题...
在 d3-format 中,我想使用与 d3-array 相同的Numeric
接口:
interface Numeric {
valueOf(): number;
}
但是当这样做时,在 d3 全局定义中,逻辑上我有错误: Module 'd3-array' has already exported a member named 'Numeric'.
是否有地方为 d3 库放置共享类型?
同样在一些 d3 定义(插值、缩放、形状)中,您可以找到联合类型number | { valueOf(): number }
。 { valueOf(): number }
还不够吗?
@denisname感谢您自愿参与d3-axis
、 d3-format
和后来的d3-array
!!!
对于您的上述问题:
(1) 作为编写d3-xxx
模块定义的基本规则,定义绝不能引入底层对应的D3 模块之间不存在的依赖关系。 例如d3-axis
不依赖于d3-array
,因此 $ d3-axis
的定义index.ts
文件不能从d3-array
导入。 这确保了与 JS 源相对应的松散耦合。 因此,如有疑问,请检查底层 D3 模块的package.json
的dependencies
属性 _注意:您当然可以从d3-xxx-test.ts
文件中的任何包中导入,这甚至是一个不错的选择实践我们在许多包中进行了“集成”测试。 即两个包之间可能没有正式的依赖关系,但一个包的成员“自然”使用另一个包的输入。 例如,我们在d3-chord
的测试中使用d3-selection
#$ 以确保和弦路径可以毫无问题地传递到选择属性设置器中。_
(2) 你是对的, Numeric
接口不能在任何其他 D3 模块中重新声明,它不能按照规则 (1) 从d3-array
导入。
(3) { valueOf(): number }
还不够吗? 从技术上讲,是的。 实际上,交集类型虽然有一些冗余,但对于许多人类用户来说,声明式可能更清晰。 即它表明number
乍一看是一个有效的类型,没有心理杂技。 :眨眼:
关于d3-color,为什么prototype
都被注释掉了? @tomwanzek 在此提交中已完成此操作。
设置原型后,我们可以直接使用instanceof
,而不需要 typeguard 函数:
let cRGB: d3.RGBColor;
let cHSL: d3.HSLColor;
const c: d3.RGBColor | d3.HSLColor = d3.color("steelblue");
if (c instanceof d3.rgb) {
cRGB = c;
} else {
cHSL = c;
}
@denisname我一直犹豫将prototype
定义为界面中已发布 API 的一部分,感觉太 hacky。
对于我从今天的类型保护规范中了解的内容。 这现在被认为是一个有效的_construction_。 查看列表项:
x instanceof C
形式的类型保护,其中 x 不是 Any 类型,C
是全局类型 'Function' 的子类型,并且C
有一个名为'原型' [...]
我想提出一个strictNullChecks
版本的d3-color
。 这只是一行更改。 这也是一个添加prototype
的机会。
根据我自己的测试,您需要prototype
属性或 $#$ instanceof
$#$ 的new(): T
声明来正确缩小类型。 我在 v3 类型中使用了new(): Color
变体,如果 D3v4 及更高版本仍支持该习语,它可能会很有用。
由于任何一个看起来都不错,我认为我们可能会遵循 v3 约定以保持连续性。 伟大的工作,两者。
@gustavderdrache
我对它为什么在 d3 v3 中起作用的理解是new()
的返回类型始终与prototype
类型相同。 但在 d3 v4 中,我们也有:
export const color: ColorFactory;
export interface ColorFactory extends Function {
(cssColorSpecifier: string): RGBColor | HSLColor;
prototype: Color; // and not RGBColor | HSLColor !
}
确实, d3.lab(0,0,0) instanceof d3.color
是真的。 因此,如果我们将此接口更改为:
export const color: ColorFactory;
export interface ColorFactory extends Function {
(cssColorSpecifier: string): RGBColor | HSLColor;
new (cssColorSpecifier: string): RGBColor | HSLColor;
}
我们没有prototype
for ColorFactory
类型Color
。 以下代码无法编译,但它不应该编译。
declare let l: d3.LabColor | null;
declare let c: d3.Color;
declare let nil: null;
if (l instanceof d3.color) {
c = l; // l is not inferred as `d3.LabColor`...
} else {
nil = l; // fail, l is a `d3.LabColor | null` should be a `null`
}
你有什么意见? 有没有办法让它与new
一起工作? 谢谢。
根据一些测试,看起来color()
的prototype
属性应该是Color
而不是RGBColor | HSLColor
:
> d3.color.prototype === d3.rgb.prototype
false
> d3.rgb.prototype instanceof d3.color
true
color()
函数返回 RGB 或 HSL 颜色,但它的原型是其他颜色空间的超类型。
@denisname @Ledragon @gustavderdrache因为你们都在这个线程上,作为一个简短的仅供参考:我打算赶上你本周末知道的未决项目。
好的,d3-geo 已经退出了(感谢@ledragon),我评论了@denisname不幸关闭的d3-format
和d3-axis
关于重新开放的 PR。
作为一般说明,我建议将@denisname添加为定义的另一个维护者,他们会继续工作。
接下来我可能会看一下d3-color
,并通过更新1.1.0加入它。 我们应该为此升级打开一个单独的问题吗?
另外,欢迎加入@denisname !
在玩了一段时间之后,我看到了问题。 你可以在ColorConstructor
接口中设置new(): Color
,但它实际上并没有涵盖函数的返回值:
declare namespace d3 {
interface Color {
// I forgot what was on the Color interface
// This property exists just to make Color incompatible with {}
__isColor: never;
toString(): string;
}
interface RGBColor extends Color {
r: number;
g: number;
b: number;
}
interface HSLColor extends Color {
h: number;
s: number;
l: number;
}
interface LABColor extends Color {
l: number;
a: number;
b: number;
}
interface ColorConstructor {
(specifier: string): RGBColor | HSLColor;
new(specifier: string): Color; // <- TS uses this for narrowing with instanceof
}
const color: ColorConstructor;
}
declare let l: d3.LABColor | null;
declare let c: d3.Color;
declare let nil: null;
if (l instanceof d3.color) {
// Succeeds with l: d3.LABColor
c = l;
} else {
// Succeeds with l: null
nil = l;
}
总之:我认为我们必须公开prototype
属性,因为它确实是涵盖构造函数和instanceof
测试的正确行为的唯一方法:
interface ColorConstructor {
(specifier: string): RGBColor | HSLColor;
new(specifier: string): RGBColor | HSLColor;
readonly prototype: Color;
}
对不起,因为延迟回到这个。 随意使用prototype
,回到过去,这也是我解决instanceof
的第一个冲动。 它只是“感觉”很老套,但因为它被认为是一种可接受的做法,并且如果在 D3v3 中使用new()
的连续性不是一个选项......让我们开始吧!
@tomwanzek你能更新跟踪表吗?
对于库d3-axis
、 d3-color
、 d3-dispatch
、 d3-format
,应在strictNullChecks
strictFunctionTypes
和TS 2.3
列中设置 ✅ d3-format
、 d3-polygon
和d3-hsv
。
此外,应该在JSDoc
列中为d3-dispatch
、 d3-polygon
和d3-hsv
设置一个 ✅。
谢谢
d3-geo
界面GeoIdentityTranform
有错字。 它应该是GeoIdentityTransform
(带有s
)。 我可以纠正吗? 对向后兼容性有任何担忧吗?
@denisname for d3-geo
s GeoIdentityTranform
,我认为我们可以执行以下操作:
geoIdentity()
的返回类型/**
* <strong i="13">@deprecated</strong> Misspelled name. Use GeoIdentityTransform.
*/
export type GeoIdentityTranform = GeoIdentityTransform;
@denisname 💯 @gustavderdrache @ledragon感谢过去一段时间的所有辛勤工作。 我更新了跟踪表,看起来已经漂亮多了! 因为我们的目标是一个漂亮的跟踪表:微笑:
因为我们的目标是一个漂亮的跟踪表
绝对地! 改进的类型定义只是一个令人愉快的副作用。
你们中的任何人现在是否正在为完成技术债务而制定具体的定义? 虽然d3-array正在进行中。 接下来我将处理d3-transition中的strictFunctionTypes
,使其与d3-selection 相提并论。 只是等待#25805 被合并。
不是自动取款机。 会让你们知道我是否以及何时
处理 #25582 以便能够标记 5.2.0 全局捆绑包
我准备好了d3-hierarchy
的更新(严格和 jsDoc)。
还致力于d3-dsv
和d3-fetch
(ts 2.3)。
@denisname @tomwanzek @gustavderdrache
我们应该专注于此,还是将 d3 更新到最新版本? 我们现在在全局包上落后了 5 个小版本(尽管我认为所有子包都准备好了5.2.0
)。 我要单独开一个 issue 来跟踪全球包裹状态吗?
@Ledragon我今晚会赶上公开的 PR,并解析所有 D3 模块定义以获取货币。 如果有任何滞后,我将创建一个跟踪问题以使它们达到标准。 至于优先事项,我同意货币应优先于技术债务减少。
很抱歉污染了这个线程,我现在要回到 D3.js 进行一个新项目。我想知道是否考虑为 D3 使用内联 TypeScript 注释?
/** <strong i="6">@type</strong> {SyncBailHook<Compilation>} */
shouldEmit: new SyncBailHook(["compilation"]),
在 webpack 中,他们开始使用 TypeScript 编译器来检查 JavaScript。最大的优点是类型定义就在实际代码旁边。
https://github.com/webpack/webpack/blob/master/lib/Compiler.js#L51
嗨@phil-lgr
不久前有一个关于d3
问题跟踪器的讨论,它似乎不在优先列表的顶部(即 Mike Bostock 更喜欢专注于开发库本身而不是类型)。 我似乎找不到该线程的链接。 也许由于这些新信息,这个问题可以再次提出,但我认为这不太可能发生
@tomwanzek你能更新跟踪表吗?
对于库d3-array
、 d3-array
、 d3-dsv
、 d3-fetch
,应在strictNullChecks
strictFunctionTypes
和TS 2.3
列中设置 ✅ d3-fetch
, d3-hexbin
, d3-hierarchy
, d3-interpolate
, d3-quadtree
, d3-queue
, d3-request
, d3-timer
和d3-voronoi
。
此外,应在JSDoc
列中为d3-color
、 d3-hexbin
、 d3-hierarchy
、 d3-interpolate
和d3-quadtree
设置 ✅。
谢谢
最有用的评论
@denisname 💯 @gustavderdrache @ledragon感谢过去一段时间的所有辛勤工作。 我更新了跟踪表,看起来已经漂亮多了! 因为我们的目标是一个漂亮的跟踪表:微笑: