【问题标题】:Force <T | null | undefined> type for function parameter力 <T |空 | undefined> 函数参数的类型
【发布时间】:2020-12-22 16:25:44
【问题描述】:

我们目前正在对旧代码库执行严格的 null 检查,并自己构建了帮助器

type Maybe<T> = T | null | undefined

我们实现了几个辅助函数,它们可能看起来像这样:

function isSafe<T>(val: Maybe<T>): val is T {
    // ...
}

Playground link

就像一个魅力,我想要的一个改进是,防止非可能值作为参数传递,因为通过这种类型,可以调用isSafe('hi'),这不能null,对于每个未包含在 Maybe 中的变量都是如此。

防止这样的调用会消除误解,因为我希望传递给isSafe 的变量是Maybe

遗憾的是,我还没有找到实现此目的的方法,因为 T | null | undefined 允许这些类型中的任何一种,而不仅仅是这三种类型的组合。

在将非Maybe 值传递给函数时,有没有办法实现类型错误? 如果它也允许 T | nullT | undefined ,则奖励积分将是我们在内部决定我们将处理这两个值相同。

【问题讨论】:

    标签: typescript typescript-typings typescript-generics


    【解决方案1】:

    这是一个有点难看但符合您的标准的解决方案:

    type DefinitelyMaybe<T> = null extends T ? T : undefined extends T ? T : never
    
    function isSafe<T>(val: DefinitelyMaybe<T>): val is NonNullable<typeof val> {
      return val !== null && val !== undefined;
    }
    
    // Argument of type 'string' is not assignable to parameter of type 'never'.
    isSafe('test');
    
    // OK
    isSafe('test' as string | undefined);
    

    本质上,DefinitelyMaybe&lt;T&gt;T 相同,只要 nullundefined 或两者都可分配给 T。否则,它是never,导致调用站点出现类型错误,因为参数不可分配给它。

    Playground Link

    【讨论】:

    • 一个地方丑就好,其他地方好看就好:) 不过真的很聪明,谢谢
    猜你喜欢
    • 2021-06-05
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 2018-08-27
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 2020-08-22
    相关资源
    最近更新 更多