从联合类型将属性作为特定类型返回的正确方法

Correct way to return a property as a specific type from a union type

提问人:OHello 提问时间:7/27/2023 最后编辑:OHello 更新时间:7/27/2023 访问量:51

问:

我有 1 个属性需要从应用程序中不同位置的函数返回。 此属性可以是 2 种类型中的 1 种,这两种类型都具有字符串文本属性。一个是另一个的延伸。 我怎样才能将我在强制转换中传递的相同变量作为类型保护中的一种或另一种类型返回?

type NameA = 'A'| 'B' | 'C'
type NameB = NameA | 'D' | 'E'
function nameTypeGuard(
    name: NameA | NameB
  ):  NameA | NameB{
    if (some condition) {
      return name as NameA;
    } else {
      return name as NameB;
    }
  }
Angular TypeScript 类型 转换

评论

0赞 wonderflame 7/27/2023
这两个名字中都有“A”。这不是一个错误吗?
0赞 OHello 7/27/2023
属性存在重叠。我会修改我的问题。

答:

4赞 Anon 7/27/2023 #1

可以使用 Conditional Type 作为返回类型。使用泛型,我的初始解决方案如下所示:

type NameA = 'A' | 'B' | 'C';
type NameB = 'A' | 'D' | 'E';

function nameTypeGuard<
  T extends NameA | NameB,
  R = T extends NameA ? NameA : NameB
>(
  name: T
): R {
  return name as unknown as R;
}

const a = nameTypeGuard("A");
const b = nameTypeGuard("B");
const c = nameTypeGuard("C");
const d = nameTypeGuard("D");
const e = nameTypeGuard("E");

TypeScript Playground:链接

评论

0赞 OHello 7/27/2023
出于好奇,在返回施法值之前,您会使用什么条件来检查属性是否是一种类型或另一种类型?
0赞 Anon 7/28/2023
@OHello 由于类型仅在编译时相关(在运行时不相关,因为 TypeScript 向下编译为 JavaScript,而 JavaScript 不是强类型,并且 TypeScript 编译器从源代码中剥离类型),因此类型决策仅由类型系统(通过第二个泛型参数 (R))执行,而无需运行时检查。