如何在方便的函数中转换TS断言条件?

问题描述 投票:0回答:1

我正在使用断言条件并有这样的代码

enum Types { a = "a", b = "b", c = "c" }

assert(condition: any): asserts condition {
  if(!condition) throw new Error();
}

function abc(type: Types) {
  assert(type === Types.a || type === Types.b);
  ...
}

function def(type: Types) {
  assert(type === Types.b || type === Types.c);
  ...
}

function ghi(type: Types) {
  assert(type === Types.c);
  ...
}

是否可以制作紧凑的通用断言函数来像这样使用并获得相同的断言类型检查?

assertType(type, [Types.a, Types.b]);
typescript enums assert
1个回答
0
投票

您可以通过执行以下操作将函数扩展到 2 或 3 个参数:

enum Types {
  a = "a",
  b = "b",
  c = "c",
}

function assertType<T, U>(v: unknown, types: [T, U]): asserts v is T | U {
  if (v!==types[0] && v!==types[1]) throw new Error("Failed condition")
}

const typeToTest = Types.a;

assertType(typeToTest, [Types.a, Types.b]); // PASS
assertType(typeToTest, [Types.a, Types.c]); // PASS
assertType(typeToTest, [Types.b, Types.c]); // FAIL

但是我认为不可能将其扩展到数组中无限数量的值。这意味着你必须有一个函数来测试 1 种类型,一个函数来测试 2 种类型......

© www.soinside.com 2019 - 2024. All rights reserved.