Definitelytyped: [D3] 细化定义/技术性债务减免

创建于 2018-02-13  ·  45评论  ·  资料来源: DefinitelyTyped/DefinitelyTyped

  • [x] [提及](https://github.com/blog/821-mention-somebody-they-re-notified)作者(参见Definitions by: index.d.ts ),以便他们可以回应。

    • 作者: @tomwanzek @gustavderdrache @Ledragon

我将此问题创建为#11365、#11365 和#17846 的替换跟踪问题。

下表是跟踪与 D3 模块定义相关的改进/技术债务的表格。

  • JSDoc:完整的 JSDoc 注释,包括参数和泛型解释
  • strictNullChecks:验证strictNullChecks和编译器选项设置为true
  • strictFunctionTypes:验证strictFunctionTypes和编译器选项设置为true
  • TS 2.3:TS 2.3的最低版本和定义使用泛型的默认值

| 定义| 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 | ✅ | ✅ | ✅ | ✅ |

最有用的评论

@denisname 💯 @gustavderdrache @ledragon感谢过去一段时间的所有辛勤工作。 我更新了跟踪表,看起来已经漂亮多了! 因为我们的目标是一个漂亮的跟踪表:微笑:

所有45条评论

@gustavderdrache @Ledragon上面我合并了几个未完成的任务以完成 D3 定义集的全部作品。

一个关键问题:我们是否希望将所有定义一致地升级为 TS >=2.3 约束,并在此过程中通过使用泛型的默认分配来删除一些函数/方法重载?
我注意到(无意中)一些定义在定义标题中已经有// TypeScript Version: 2.3约束。 例如d3-geo ,它使用geoJson定义。 这些已经使用通用默认值。

您对此事的想法将非常受欢迎。

明白这一点,你必须研究它

如果实现最低 TS 2.3,我们还应该能够在适当的情况下使用object类型而不是any 。 附带 TS 2.2。 如果我没记错的话,对象插值器和 d3-collection 有一些机会。

第一个想法:

  • 由于您遇到的内存不足错误,我们不应该到处强制执行 2.4 吗?
  • 我在这里有一个带有strictNullChecksstrictFunctionTypes分支。 我会更新它并提交 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 测试。 我先去看看

23794 提交 - 不是我最自豪的工作,让我们看看它是如何进行的......

好的,所以问题如下: 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中,并且strictNullChecksstrictFunctionTypes设置为 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-axisd3-format和后来的d3-array !!!

对于您的上述问题:

(1) 作为编写d3-xxx模块定义的基本规则,定义绝不能引入底层对应的D3 模块之间不存在的依赖关系。 例如d3-axis不依赖于d3-array ,因此 $ d3-axis的定义index.ts文件不能从d3-array导入。 这确保了与 JS 源相对应的松散耦合。 因此,如有疑问,请检查底层 D3 模块的package.jsondependencies属性 _注意:您当然可以从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-formatd3-axis关于重新开放的 PR。

作为一般说明,我建议将@denisname添加为定义的另一个维护者,他们会继续工作。

接下来我可能会看一下d3-color ,并通过更新1.1.0加入它。 我们应该为此升级打开一个单独的问题吗?

另外,欢迎加入@denisname

@Ledragon谢谢。

我准备好了d3-color的更新(还没有lhcgray )。 我只是被一个小问题困住了。

@gustavderdrache说:

color() 函数返回 RGB 或 HSL 颜色,但它的原型是其他颜色空间的超类型。

确实,这可以很容易地_typed_,请参阅我评论中的第一个界面。 但是@tomwanzek建议只使用new()并避免使用prototype 。 我认为在这种特殊情况下是不可能的。 不?...

在玩了一段时间之后,我看到了问题。 你可以在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-axisd3-colord3-dispatchd3-format ,应在strictNullChecks strictFunctionTypesTS 2.3列中设置 ✅ d3-formatd3-polygond3-hsv

此外,应该在JSDoc列中为d3-dispatchd3-polygond3-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-dsvd3-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-arrayd3-arrayd3-dsvd3-fetch ,应在strictNullChecks strictFunctionTypesTS 2.3列中设置 ✅ d3-fetch , d3-hexbin , d3-hierarchy , d3-interpolate , d3-quadtree , d3-queue , d3-request , d3-timerd3-voronoi

此外,应在JSDoc列中为d3-colord3-hexbind3-hierarchyd3-interpolated3-quadtree设置 ✅。

谢谢

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

fasatrix picture fasatrix  ·  3评论

csharpner picture csharpner  ·  3评论

victor-guoyu picture victor-guoyu  ·  3评论

jamespero picture jamespero  ·  3评论

ArtemZag picture ArtemZag  ·  3评论