在下面的示例中,我得到ctrl
。这对我来说没有意义,因为shift
函数的返回类型基本上是字符串|编号|任何,取决于不同的类型。
enter
我发现了一些类似的问题,但在此问题上没有任何真正的帮助。
答案 0 :(得分:1)
为了解决该问题而无需类型声明函数,需要提供重载。
private void clearAccounts() {
AccountManager manager = AccountManager.get(getApplicationContext());
AuthenticatorDescription[] authTypes = manager.getAuthenticatorTypes();
for (AuthenticatorDescription authDesc : authTypes) {
Account[] accounts = manager.getAccountsByType(authDesc.type);
if (accounts.length == 0) {
continue; // No accounts of this type, continue loop.
}
for (final Account account : accounts) {
manager.removeAccount(account, null, null, null);
}
}
}
为什么有效:
function strToTs(val: string, t: 'number'): number
function strToTs(val: string, t: 'string'): string
function strToTs(val: string, t: 'string' | 'number'): string | number {
if (t === 'string') {
return val; // no error
}
return 15; // no error
}
const a = strToTs('test', 'string');
const b = strToTs('test', 'number');
上有效,因此在这方面,两种回报都是正确的参数与返回类型之间不可能存在条件关系,因此通用方法需要类型断言:
string | number
为什么条件类型在这里不起作用。考虑返回类型的普通版本:
function strToTs<ReturnT extends RType>(val: string, t: ReturnT): MapType<ReturnT> {
if (t === 'string') {
return val as MapType<ReturnT>; // assertion
}
return 15 as MapType<ReturnT>; // assertion
}
function strToTs<ReturnT extends RType>(val: string, t: ReturnT)
: ReturnT extends 'string' ? string : number {
if (t === 'string') {
return val; // error
}
return 15; // error
}
正确地解析为ReturnT extends 'string' ? string : number
或string
,但是函数主体返回解析为number
,主体内部的条件聚集在联合中,内部的条件函数的主体不会缩小返回类型。这意味着我们永远无法将条件类型解析为联合。重载之所以起作用,是因为实现说return是string | number
的正确定义,重载定义定义了函数的使用方式,而对实现没有影响,实现需要在所有重载中定义所有类型的并集。