【问题标题】:Pass string as variable to literal method type hint将字符串作为变量传递给文字方法类型提示
【发布时间】:2020-03-25 15:12:23
【问题描述】:

我会将字符串类型的变量传递给外部库方法,该方法具有由定义的文字暗示的参数类型之一。下面是对我有问题的示例代码。代码有错误:'string' 类型的参数不能分配给'Literal' 类型的参数。我怎样才能使这个代码工作?

type Literal = 'A' | 'B' | 'C';

function isAWithLiteral(literal:Literal): boolean
{
    return literal === 'A';
}

console.log(isAWithLiteral('B'));
console.log(isAWithLiteral('A'));

function isAWithString(literal: string): boolean
{
    return isAWithLiteral(literal);
}

我想用我的界面完全覆盖外部库。我不会在任何代码中使用 Literal 依赖项,只需要一个适配器。

【问题讨论】:

  • 如果传递给isAWithString 的参数不是Literal 怎么办?你想发生什么?
  • 我会抛出错误。

标签: javascript typescript literals


【解决方案1】:

在首先检查您的字符串确实是Literal 的值之一之后,您可以使用类型断言从string 转到Literal

function isAWithString(literal: string): boolean
{
    if (literal !== 'A' && literal !== 'B' && literal !== 'C') {
    {
        throw new Error(`'literal' isn't a Literal: ${literal}`);
    }
    return isAWithLiteral(literal as any as Literal);
}

如果Literal 是您自己的代码,我建议改用enum,以便需要执行此操作的代码可以遍历这些值。但是你说它在一个外部库中,所以......

【讨论】:

  • 更复杂的东西?我的意思是外部库的文字中有很多值。我想做你的解决方案,但使用文字值数组或迭代文字。我是 TS 的新手,不太了解语法。
  • Literal 是外部库代码,我不想在适配器之外使用它。
  • @gargi258 - 联合类型的成员不能作为运行时值访问,所以不幸的是,AFAIK 没有比这更复杂的了。 (这是改用enum 的原因之一。)但我不会让您自己的代码传递字符串而不是Literals。如果您不想在适配器外部使用Literal(这是有道理的),您可以使用您想要使用的Literal 的值定义您自己的enum 并使用它。但最终你将需要 as any as Literal 断言来跨越边界(或者你的枚举上的 switch 等)。
  • 它对我来说很好用。它只在一个地方处理,适应我想要实现的目标。谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-07-03
  • 2020-01-30
  • 1970-01-01
  • 1970-01-01
  • 2011-01-03
  • 2012-03-03
  • 2020-10-27
  • 2019-07-13
相关资源
最近更新 更多