如何在TypeScript 2.0中定义一个检查参数是否为字符串的函数

时间:2016-08-31 07:59:45

标签: typescript typescript2.0

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

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语句正确地缩小param的类型?

2 个答案:

答案 0 :(得分:3)

Typescript有enter image description here来帮助解决这个问题。

您可以拥有Type Guards

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 } }

NSString *path = [NSString stringWithFormat:@"%@/Documents/Small-mario.png", NSHomeDirectory()];
    NSLog(@"path %@", path);
displayImg.image = [UIImage imageNamed:path];

答案 1 :(得分:1)

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

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