函数参数的类型,typescript,typescript-typings,typescript-generics"/>

首页 > 解决方案 > 力量函数参数的类型

问题描述

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

type Maybe<T> = T | null | undefined

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

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

游乐场链接

像魅力一样工作,我想要的改进是,防止非可能值作为参数传递,因为通过这种类型,可以调用isSafe('hi'),而不能调用 ,null情况就是这样每个未包含在Maybe.

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

可悲的是,我还没有找到一种方法来实现这一点,因为它T | null | undefined允许任何这些类型,而不仅仅是这 3 种的组合。

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

标签: typescripttypescript-typingstypescript-generics

解决方案


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

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<T>件事。否则,它会导致调用站点出现类型错误,因为参数不可分配给它。TnullundefinedTnever

游乐场链接


推荐阅读