TypeScript defaultIfUndefined 函数类型
TypeScript defaultIfUndefined function typing
我正在尝试编写一个简单的函数,其中 returns 一个 defaultValue
,如果 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
的情况下使它工作吗?
--
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
,打字稿在推断文字类型时会过于激进,& {}
修复了该问题。
我正在尝试编写一个简单的函数,其中 returns 一个 defaultValue
,如果 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
的情况下使它工作吗?
--
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
,打字稿在推断文字类型时会过于激进,& {}
修复了该问题。