如何将String变量强制转换为Typescript中的String Literal类型

时间:2016-07-22 11:10:18

标签: typescript casting string-literals

在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 个答案:

答案 0 :(得分:5)

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

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

在函数定义中,将此类型用于param

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

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

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

答案 1 :(得分:4)

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

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

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

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

进行演员表演的另一种方法是预先设置类型:

foo(<Tristate> validInput);

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

答案 2 :(得分:0)

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

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的答案相比,您得到了更好的封装。