TypeScript有没有办法静态判断空字符串?有没有一种方法可以静态地要求将非空字符串传递给函数?

let fn = function(a:string){

};

fn('');

let a = '';
fn(a);

在这能帮我们吗?

推荐答案

我相信这是你只需要使用打字系统(而不是"非空"类)就能做到的

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等于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)污染类型.

Typescript相关问答推荐

无法绑定ngModel.条件ngSwitchCase中的错误

隐式键入脚本键映射使用

学习Angular :无法读取未定义的属性(正在读取推送)

从子类构造函数推断父类泛型类型

路由链接始终返回到

在类型脚本中创建泛型类型以动态追加属性后缀

在保留类型的同时进行深层键名转换

以Angular 执行其他组件的函数

确保对象列表在编译时在类型脚本中具有唯一键

在类型脚本中将泛型字符串数组转换为字符串字母并集

在Cypress中,是否可以在不标识错误的情况下对元素调用.Click()方法?

使用来自API调用的JSON数据的Angular

映射类型不是数组类型

如何使用useSearchParams保持状态

如何在 TypeScript 类型定义中简化定义长联合类型

如何在Typescript 中定义具有相同类型的两个泛型类型的两个字段?

基于泛型的柯里化函数的条件参数

为什么在判断参数是否等于联合类型值的条件下,通用类型T extends 'a' | 'b'未正确解析?

未找到 Storybook 设计系统声明文件

TypeScript 方法包装另一个类的任何方法