TypeScript defaultIfUndefined函数输入

时间:2019-01-11 13:15:44

标签: typescript generics type-inference typescript-generics

我正在尝试编写一个简单的函数,如果返回// Will check if Angular still has pending http_requests ongoing and wait if required public boolean untilAngularHasFinishedProcessing() { until(() -> { final boolean hasFinishedLoading = Boolean.valueOf(((JavascriptExecutor) driver) .executeScript("return (window.angular !== undefined) " + "&& (angular.element(document).injector()!==undefined) " + "&&(angular.element(document).injector().get('$http')" + ".pendingRequests.length===0)").toString()); log.info("Waiting on angular to finish processing => " + hasFinishedLoading); return hasFinishedLoading; } ); return true; } ,则会返回一个defaultValue

该功能非常简单:

value === undefined

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

该函数应该简单地从类型中删除const defaultIfUndefined = (value, defaultValue) => { return value === undefined ? defaultValue : value; }

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

1。

undefined

2。

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

3。

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

4。

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

第一个示例运行正常,只要我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的情况下使它正常工作吗?

-

Link到TypeScript游乐场

1 个答案:

答案 0 :(得分:2)

包含未解析类型参数的条件类型通常将需要类型声明。这是由于这样的事实,即打字稿不会对此类类型进行太多数学运算,而只是检查条件类型是否完全匹配。

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

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,则打字稿在推断文字类型时会过于激进,& {}会解决该问题。