gpt4 book ai didi

javascript - 没有显式字符串的详尽检查

转载 作者:搜寻专家 更新时间:2023-10-30 21:29:11 25 4
gpt4 key购买 nike

在函数末尾分配(或断言)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/

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