我正在尝试编写一个简单的函数,如果返回// 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游乐场
答案 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
,则打字稿在推断文字类型时会过于激进,& {}
会解决该问题。