angular 穷尽性@switch类型检查

oknrviil  于 5个月前  发布在  Angular
关注(0)|答案(7)|浏览(54)

与功能请求相关的@angular/*包有哪些?

common

描述

我认为如果@switch被检查为详尽,那么它将是模板类型安全的很好的补充。
目前,如果你有一个字段有3种可能的值:

type UserType = 'admin' | 'logged' | 'anonymous'

然后在模板中使用一个@switch:

@switch (userType) {
  @case ('admin') {
    Hello admin
  }
  @case ('logged') {
    Hello user
  }
}

模板编译得很好,而'anonymous'的情况没有被覆盖。

建议的解决方案

如果缺少一个情况(当然没有提供默认值),那就太好了能得到一个编译错误。
TypeScript会在函数中使用switch返回值时抱怨缺少一个case:

function s(userType: UserType): boolean {
  switch (userType) {
    case 'admin': return true;
    case 'logged': return true;
  }
}

生成的TCB可能是沿着这些思路编写的代码,而不是一个“简单”的switch?

考虑过的替代方案

我认为我们不能轻易地解决这个问题吗?

laawzig2

laawzig21#

在这里也做一个评论:我个人希望看到这个功能,但我希望有需要不完全的开关的情况,在这种情况下,你不想让这个报告错误。
也许有一个空的 @default {} 块就足够表示了吗?

qlckcl4x

qlckcl4x2#

是的,我也这么想。
也许@jessicajaniuk正在进行的迁移可以将非详尽的交换机迁移到:

@default { <!-- TODO --> }

以表示在不破坏现有应用程序的情况下需要完成一些工作。

gxwragnw

gxwragnw3#

这里有两点:

  1. 空的 @default 或者 @default never 也可以工作。
  2. 在 TypeScript 的 switch case 中,我们通常使用抛出异常的 never 函数 - 这些构造是否也会生成抛出异常?
up9lanfz

up9lanfz4#

在团队中讨论过,我们可能想在某个时候将其作为功能添加进来,但目前不将其视为优先事项。

cgfeq70w

cgfeq70w5#

当前的解决方法:
考虑模型:

{type: 'a', value: number} | {type: 'b', name: string}

我们可以创建一个组件:

@Component({
  selector: 'app-never',
  standalone: true,
  template: ''
})
export class NeverComponent {
  @Input() value: never;

  constructor() {
    throw new Error('Never!');
  }
}

使用方式:

@if (test.type === 'a') {
  {{test.value}}
} @else if (test.type === 'b') {
  {{test.name}}
} @else {
  <app-never [value]="test" />
}

如果我们遗漏了一个情况,它将抛出一个编译错误:

de90aj5v

de90aj5v6#

与NgSwitch相关的议题:#49089

hs1rzwqc

hs1rzwqc7#

你好,希望你找到ngx-exhaustive-check包很有帮助:

@switch (userType) {
  @case ('admin') {
    Hello admin
  }
  @case ('logged') {
    Hello user
  }
  @default {
+   {{ userType | exhaustiveCheck }}
<!--   ^^^^^^^^ Argument of type '"anonymous"' is not assignable to parameter of type 'never'. -->
  }
}

相关问题