gpt4 book ai didi

javascript - 闭包编译器中标记的联合

转载 作者:行者123 更新时间:2023-12-03 05:25:26 25 4
gpt4 key购买 nike

我目前正在比较 Google Closure CompilerFlow静态类型检查器,在表达能力方面。我喜欢后者的是它显然可以 represent tagged unions相当好。手册给出了这个例子:

type Result = Done | Error; // a disjoint union type with two cases
type Done = { status: 'done', answer: Matrix };
type Error = { status: 'error', message: string };

有没有办法使用闭包编译器来做这样的事情?这意味着有某种方法可以强制对象的某些属性不仅是特定类型,而且具有固定值?并使用该值进行类型推断,以区分联合中的不同选项?我没有找到这方面的文档。

最佳答案

没有准确的翻译。我会这样写:

/** @enum {string} */
var ResultStatus = {
DONE: 'done',
ERROR: 'error'
};

/** @record */
var Done = function() {};

/** @type {ResultStatus} */
Done.prototype.status;

/** @type {Matrix} */
Done.prototype.answer;

/** @record */
var Error = function() {};

/** @type {ResultStatus} */
Error.prototype.status;

/** @type {string} */
Error.prototype.message;

/** @type {Result|Error} */
var Result;

这是一种非常冗长的语法,但提供了最好的类型检查。任何具有这些属性的对象都被认为与该类型匹配。允许额外的属性。

有一种更短的语法,但行为略有不同:typedef。

/** @enum {string} */
var ResultStatus = {
DONE: 'done',
ERROR: 'error'
};

/**
* @typedef{{
* status: ResultStatus
* answer: Matrix
* }}
*/
var Done;

/**
* @typedef{{
* status: ResultStatus
* message: string
* }}
*/
var Error;

/** @type {Result|Error} */
var Result;

还有几种其他方法可以编写这些类型。您选择哪个取决于您想要检查的内容。例如,如果您拼写错误(或尝试添加)某个属性,您是否希望收到警告?您想要属性名称或类型完全匹配,还是允许额外的属性?

关于javascript - 闭包编译器中标记的联合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41165103/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com