Проверка TypeScript для пустой строки

есть ли способ для TypeScript статически проверять пустую строку? Есть ли способ статически требовать, чтобы непустая строка передавалась функции?

let fn = function(a:string){

};

fn('');

или

let a = '';
fn(a);

может TS помочь нам здесь?

2 ответов


Я считаю, что это так близко, как вы собираетесь получить только с помощью системы ввода (а не с классом "nonEmptyString")

type nonEmptyString = never; // Cannot be implicitly cast to
function isNonEmptyString(str: string): str is nonEmptyString {
    return str && str.length > 0; // Or any other logic, removing whitespace, etc.
}

тестирование это:

let fn = function(a: nonEmptyString) {

}

let someStr = '';
if (isNonEmptyString(someStr)) {
    fn(someStr); // Valid
} else {
    fn(someStr); // Compile error
}

к сожалению, вы в конечном итоге с бородавками с nonEmptyString is never. Это означает, что вам нужно явно бросить nonEmptyString на string.

let fn = function(a: nonEmptyString) {
    let len = a.length; // Invalid
    let len2 = (<string>a).length; // Valid
    let str = a + 'something else'; // Valid (str is now typed as string)
}

одно возможное решение-это:

type nonEmptyString = string & { __nonEmptyStr: never };

что облегчает проблему явного возврата к строке (все три теста выше действительны), но загрязняет тип с __nonEmptyStr (который будет undefined если ссылаться).


ты можешь ввести его с перегрузками, например, чтобы дать плохой тип возврата "" это приведет к ошибке, как только вы используете его в другом месте:

type MyFnType = {
  (a: "") => never;
  (a: string) => whatever;
}

function fn: MyFnType = ...