- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在函数末尾分配(或断言)never
是 Typescript 中使用的一种技术,目的是在编译时强制进行详尽检查。
然而,为了让编译器检测到这一点,它需要显式字符串来检查以确定函数是否在 never
的赋值/断言之前明确返回。
是否有可能引入某种类型的 Object.freeze 变体,它只适用于对象字面量,并进一步向上移动,以便可以完成类似以下的事情?
更好的是,有没有一种方法可以创建一个界面,其中键自动是 Action.type 的 each 键(在本例中)?如果是这种情况 - actionMap
可以简单地声明为该接口(interface),这将在编译时强制进行检查。
两者都是针对同一个问题的解决方案...仅给定一个可区分的联合,是否可以在编译时进行这样的详尽检查,而无需在函数中使用显式字符串?
interface Increment {
type: 'increment'
}
interface Decrement {
type: 'decrement'
}
type Action = Increment | Decrement
const inc: Increment = { type: 'increment' };
const dec: Decrement = { type: 'decrement' };
//this would be a typescript variation
const actionMap = Object.freeze({
[inc.type]: n => n + 1,
[dec.type]: n => n-1
});
function doAction(action: Action, val: number): number {
if(actionMap[action.type]) {
return actionMap[action.type](val);
}
//this would error at compile time if the above checked failed
const _exhaustiveCheck: never = action;
}
console.log(doAction(inc, 1));
console.log(doAction(dec, 1));
最佳答案
有一种相当直接的方法可以制作 map ,保证它对可区分联合中的每个案例都有值(value)。您只需对其进行设置,使其键的类型为可区分的联合标识符。
type ActionMap = {
[P in Action["type"]]: (val:number)=>number
};
然后你可以实现这个接口(interface),看起来像这样:
var map: ActionMap = {
decrement: n => n - 1,
increment: n=> n + 1
}
编辑:经过一番折腾之后,我发现了一个更加通用和强大的解决方案,它不仅可以让您键入已区分的联合值的键,还可以让您键入有效载荷。
首先:以键:类型对的形式定义联合。 (无论如何,我认为这更容易阅读)
type Actions = {
"increment": { incrementValue: number }
"decrement": { decrementValue: number }
}
第二:从该 map 创建一个行动歧视联盟。这不是世界上最清晰的代码,它所做的是为 ActionsMap
中的每个键值对通过添加类型值 {type:key}
创建一个新类型然后将所有这些类型加在一起以创建您的 Discriminated Union。
type Action = {
[P in keyof Actions]: { type: P } & ActionsMap[P]
}[keyof Actions];
第三步:为您的 map 创建一个类型
type ActionsMap = {
[P in keyof Actions]: (val:number,action:Actions[P])=>number
}
第四:享受您的完全类型安全的操作/reducer 映射!
const map:ActionsMap = {
decrement: (val, action) => val + action.decrementValue,
increment: (val, action) => val + action.incrementValue,
}
公平警告。这极大地插入了 typescript 定义可以做什么的限制,我个人已经被依赖一些 typescripts 边缘行为所困扰,只是为了在下一个版本中改变它。
关于javascript - 没有显式字符串的详尽检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45863759/
我需要根据需要动态设置文本区域,但它不想正常工作。 JQuery 会自行检查,但无法检查是否已检查。但是当您在第二个单选框内单击时,始终需要文本区域。我尝试了很多次让它工作,但它仍然有问题。我添加了“
我需要在 Django 中进行 API 调用(某种形式),作为我们所需的自定义身份验证系统的一部分。用户名和密码通过 SSL 发送到特定 URL(对这些参数使用 GET),响应应该是 HTTP 200
我将在我的可移植 C 代码中使用 #warning 来生成编译时警告。但并非所有平台都支持 #warning。有什么方法可以找到该平台是否支持 #warning。 #ifdef warning
我编写了一个函数来检查某个数字是否存在于某个区间内。停止搜索的最佳方法是什么?这个: for (i = a; i <= b; i++) { fi = f(i); if (fi == c) {
我想知道在 c 中是否有一种方法可以检查,例如在 for 函数中,如果变量等于或不等于某些字符,而不必每次都重复进行相等性检查。如果我没记错的话,以这种方式检查相等性是不正确的: if (a == (
我有如下日志功能 void log_error(char * file_name, int line_num, int err_code) { printf("%s:%d:%s\n", fil
使用 ssh-keygen 生成的 key 对在 macOS 上可以有不同的格式。 macOS 可读的标准 PEM ASN.1 对象 SecKey API 带有文本标题的 PEM OpenSSH ke
我正在尝试编写一个 excel if 语句。我不熟悉使用 Excel 具有的所有额外功能。我正在使用一个名为 importXML() 的函数.我正在尝试检查我正在使用的函数是否生成“#VALUE!”错
有没有办法检查是否没有 AIO 写入给定文件?我在我的 Unix 类(class)上制作了一个项目,该项目将是一个上下文无关(基于 UDP)的国际象棋服务器,并且所有数据都必须存储在文件中。应用程序将
我有一个如下所示的函数: public Status execute() { Status status = doSomething(); if (status != Stat
我正在使用 Composer,我不希望 PhpStorm 在 vendor 文件夹上运行任何错误检查或检查,因为它对 vendor/中的某些代码显示误报composer/autoload_static
Chapel 的一个很好的特性是它区分了数组的域和它的分布。检查两个数组是否具有相同的域和分布(通常想要的)的最佳方法是什么? 我能看到的最好的方法是检查 D1==D2和 D1.dist==D2.di
在我的 JavaScript 函数中,我为所有输入、文本区域和选择字段提供实际值作为 initial_value: $('input, textarea, select').each(function
我正在编写一个分解为几个简单函数的 PHP 类。在构造函数中,它调用另一个名为 processFile 的函数。该函数调用 5 个私有(private)函数并进行检查。如果检查失败,它会将消息分配给
这个问题已经有答案了: How to detect if user it trying to open a link in a new tab? (2 个回答) 已关闭 7 年前。 我认为 JavaS
我正在浏览我们的代码库并看到很多这样的测试: declare @row_id int = ... declare @row_attribute string select @row_attribu
我正在声明一个用作比较的函数。我的问题是: 为什么条件充当语句? 为什么第 4 行可以工作,而第 5 行却不行? 我知道这段代码不切实际且未使用,但为什么编译器允许这种语法? 谷歌没有找到答案。但话又
到目前为止,我有一个带有空文本字段的 PHP Kontaktform,并使用以下命令检查了所需的字段: $name = check_input($_POST['name'], "请输入姓名。"); 现
目前,我能想到的合理检查的唯一方法没有臃肿的逻辑: if ( $value > 0 ) { // Okay } else { // Not Okay } 有没有更好的办法? 最佳答案
我正在尝试运行一个脚本,如果 i 存在(意味着存在 i 值,任何值)或其他部分,我希望运行其中的一部分如果i没有值就运行,有人可以启发我吗? 我说的是 for 循环,比如 for (var i=0;
我是一名优秀的程序员,十分优秀!