Как определить функцию, которая проверяет, является ли параметр строкой в ​​TypeScript 2.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, чтобы сделать пример, если оператор правильно сузил тип параметра?


person Rafael Munitić    schedule 31.08.2016    source источник


Ответы (2)


В Typescript есть защиты типа для помогите с этим.

У вас может быть защита, определяемая пользователем :

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
    }
}
person Nitzan Tomer    schedule 31.08.2016

Чтобы это работало, возвращаемый тип должен использовать специальный синтаксис защиты типа:

function isString(value: any): value is string {
    return typeof value === 'string' || value instanceof String;
}
person Simon Meskens    schedule 31.08.2016