如何在 Typescript 中将字符串变量转换为字符串文字类型

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

在 Typescript 中,假设我想调用具有以下签名的函数 -

function foo(param: "TRUE"|"FALSE"|"NONE")

我怎样才能做类似的事情-

var str = runtimeString()
if(str === "TRUE" | str === "FALSE" | str === "NONE")
    foo(str)

或者,明确的值是唯一的方法-

var str = runtimeString()
if(str === "TRUE")
    foo("TRUE")
else if(str === "FALSE" )
    foo("FALSE")
else if(str === "NONE")
    foo("NONE")
typescript casting string-literals
4个回答
15
投票

创建字符串文字类型,如下所示:

type NullableBoolean = "TRUE" | "FALSE" | "NONE";

在函数定义中,使用此类型表示

param
:

function foo(param: NullableBoolean)
{
    ...
}

确保将字符串转换为字符串文字类型:

var str = runtimeString();
if(str === "TRUE" || str === "FALSE" || str === "NONE")
    foo(<NullableBoolean>str);

14
投票

如果您确定运行时字符串是有效选项之一,则可以将字符串转换为需要字符串文字类型的函数类型。

type Tristate =  "TRUE"|"FALSE"|"NONE";

function foo(param: Tristate) {
    return "enhanced: " + param;
}

let validInput = "NONE";
foo(validInput as Tristate);

进行转换的另一种方法是在前面添加类型,如下所示:

foo(<Tristate> validInput);

请注意,您会覆盖编译器对运行时字符串中的数据的看法。因此,在运行时,定义的三个字符串以外的值可能会进入您的

foo
函数。


9
投票

我发现最好的方法是创建一个类型保护

type NullableBoolean = "TRUE" | "FALSE" | "NONE";
function foo(param: NullableBoolean)
{
    ...
}

function isNullableBool(str: string): str is NullableBoolean
{
    return str === "TRUE" || str === "FALSE" || str === "NONE"
}

if(isNullableBool(str)) { foo(str); }

这并不理想,因为您必须重复值列表,但您会得到比 Brett 的答案更好的封装。


0
投票

@SimonBergot 上面有答案,但这是避免数组中重复的一种方法

const nullableBooleanValues = ["TRUE", "FALSE", "NULL"] as const;

type NullableBoolean = typeof nullableBooleanValues[number];

const isNullableBoolean = (value: unknown): value is NullableBoolean =>
  nullableBooleanValues.includes(value as NullableBoolean);
© www.soinside.com 2019 - 2024. All rights reserved.