【发布时间】:2020-04-28 07:34:45
【问题描述】:
我有一个看起来像这样的联合类型:
type Action = 'foo' | 'bar' | 'baz';
我希望编译器在有人扩展它时抛出错误(通过添加另一种类型)。
看看这段代码:
type Action = 'foo' | 'bar' | 'baz';
function create(action: Action) {
let something;
switch (action) {
case 'foo':
something = action.toLowerCase();
break;
case 'bar':
something = action.toUpperCase();
break;
}
return something;
}
如您所见,baz 案例没有以任何方式处理,看起来对于打字稿来说完全没问题。你知道如何强制 TS 在这里抛出错误(因为 baz 类型没有被处理)?
游乐场:here
【问题讨论】:
-
您如何定义该规则? TS在什么情况下应该抛出这个错误?这个定义还会打破多少其他守则?国际海事组织。我不认为这是对一种语言的合理期望。
-
我不知道。也许像
switch(action): Action这样的东西。我看到const obj: Record<Action, string>工作正常 - 您必须声明所有 3 个属性。所以也许我会选择这种方式。基本上我想从 TS 获得信息,当开发人员扩展联合类型时,某些情况需要在代码中的某处处理 -
但是从TS的角度来看,是不需要处理的。并且用所有必需的属性实例化 Type 与 “我希望这个特定的函数来处理这个特定的联合类型的所有可能值” 不同。或者您是否希望每个使用联合类型(在互联网上的每个 TS 代码中) 的函数都需要处理该联合类型的所有可能值?您将如何定义语言级别的规则?您将如何定义该规则应适用于哪些函数和哪些联合类型?