Проверка 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 = ...