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

29
在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")
3个回答

15

如下所示创建一个字符串字面量类型:

type NullableBoolean = "TRUE" | "FALSE" | "NONE";
在函数定义中,使用此类型来表示param:
function foo(param: NullableBoolean)
{
    ...
}

请确保将字符串转换为字符串字面量类型:

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

1
额外的函数是不必要的; <NullableBoolean>str 单独使用也可以。 - Julian Egner

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的回答,这种方法更能实现封装。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接