首页 > 解决方案 > TypeScript defaultIfUndefined 函数类型

问题描述

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

功能超级简单:

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;
}

第一个例子工作正常,只要我return ... as any.

但是有没有办法让这个工作没有as any

--

链接到 TypeScript Playground

标签: typescriptgenericstype-inferencetypescript-generics

解决方案


包含未解析类型参数的条件类型通常需要类型断言。这是因为 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 & {}. 如果将其更改为 just T,则打字稿在推断文字类型时会过于激进,这是& {}固定的。


推荐阅读