1

假设我有一个函数来检查参数是否是这样定义的字符串:

function isString(value: any): boolean {
    return typeof value === 'string' || value instanceof String;
}

现在,当我将此功能与 typescript 2.0 控制流分析一起使用时,我希望以下内容可以工作:

function foo(param: string|Foo) {
   if(isString(param)) {
      // param is not narrowed to string here
   } else {
      // param is not narrowed to Foo here 
   }
}

有没有一种不同的方法可以定义 isString 来使示例 if 语句正确地缩小参数的类型?

4

2 回答 2

3

Typescript 有Type Guards来帮助解决这个问题。

您可以有一个用户定义的警卫

function isString(value: any): value is string {
    return typeof value === 'string' || value instanceof String;
}

function foo(param: string | Foo) {
    if (isString(param)) {
        // param is string
    } else {
        // param is Foo
    }
}

但在你的情况下,你可以使用typeof

function foo(param: string | Foo) {
    if (typeof param === "string") {
        // param is string
    } else {
        // param is Foo
    }
}

如果Foo是一个类,那么你也可以使用instanceof

function foo(param: string | Foo) {
    if (param instanceof Foo) {
        // param is Foo
    } else {
        // param is string
    }
}
于 2016-08-31T08:06:50.577 回答
1

返回类型需要使用自定义类型保护语法才能工作:

function isString(value: any): value is string {
    return typeof value === 'string' || value instanceof String;
}
于 2016-08-31T08:05:13.693 回答