类型无法分配给映射类型

时间:2020-01-17 14:19:02

标签: typescript

在下面的示例中,我得到ctrl。这对我来说没有意义,因为shift函数的返回类型基本上是字符串|编号|任何,取决于不同的类型。

enter

我发现了一些类似的问题,但在此问题上没有任何真正的帮助。

1 个答案:

答案 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 : numberstring,但是函数主体返回解析为number,主体内部的条件聚集在联合中,内部的条件函数的主体不会缩小返回类型。这意味着我们永远无法将条件类型解析为联合。重载之所以起作用,是因为实现说return是string | number的正确定义,重载定义定义了函数的使用方式,而对实现没有影响,实现需要在所有重载中定义所有类型的并集。