TypeScript defaultIfUndefined 函数类型

标签 typescript generics type-inference typescript-generics

我正在尝试编写一个简单的函数,如果value === undefined,它会返回一个defaultValue

功能 super 简单:

const defaultIfUndefined = (value, defaultValue) => {
    return value === undefined ? defaultValue : value;
}

但是类型/类型推断不起作用。

函数应该简单地从类型中删除undefined

我尝试了几种不同的方法,但总是出现一些错误。

1.

const defaultIfUndefined = <T>(value: T, defaultValue: Exclude<T, undefined>): Exclude<T, undefined> => {
    return value === undefined ? defaultValue : value;
}

2.

const defaultIfUndefined = <T, U extends Exclude<T, undefined>>(value: T, defaultValue: U): U => {
    return value === undefined ? defaultValue : value;
}

3.

const defaultIfUndefined = <T, U extends T | undefined>(value: U, defaultValue: Exclude<U, undefined>): Exclude<U, undefined> => {
    return value === undefined ? defaultValue : value;
}

4.

const defaultIfUndefined = <T, U extends T | undefined, V extends Exclude<U, undefined>>(value: U, defaultValue: V): V => {
    return value === undefined ? defaultValue : value;
}

只要我返回... as any,第一个示例就可以正常工作。

但是有没有什么方法可以让这个在没有as any的情况下工作?

--

Link到 TypeScript Playground

最佳答案

包含未解析类型参数的条件类型通常需要类型断言。这是因为 typescript 不对此类类型进行太多数学计算,它只是检查条件类型的精确匹配。

解决方案是避免条件类型:

const defaultIfUndefined = <T>(value: T | undefined | null, defaultValue: T & {}): T => {
  return value || defaultValue;
}

let a : string | null = Math.random() > 0.5 ? "" : null;
let aNotNull = defaultIfUndefined(a, "") // string 

仅对 T 和 {} 进行注释。如果将其更改为仅 T,Typescript 在推断文字类型时会过于激进,& {} 修复了该问题。

关于TypeScript defaultIfUndefined 函数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54147316/

相关文章:

Angular2 构建失败,出现 "Cannot find name ' 文档'”;其他引用也无法解析

javascript - 使用 Typescript 通过 getInitialProps 将 prop 传递到 Next.js 中的每个页面

java - 创建泛型类以传递泛型类型(对象或列表)

如果将泛型用作回调的参数,则 TypeScript 泛型的类型推断会失败

javascript - angular6 中的 PWA 应用程序更新警报

Angular ngIf : Identifier 'length' is not defined

Java:泛型方法重载歧义

C# 泛型 : Reference types vs. 值类型

haskell - GHC 推断我的模糊类型使约束成功

c# - .NET:静态方法的推断泛型类型