类型'string'不能用于索引类型'unknown ||或如何让打字稿分配Type [key] = SameType [key]

时间:2019-07-31 07:06:30

标签: typescript

我有这个辅助功能:

I am using one Pojo and I am getting databinding error 

Found data binding errors.
****/ data binding error ****msg:Could not find accessor com.jmr.agency.banking.data.db.communication.CommTransaction.dName
file:C:\Users\1432\Documents\Pooja\my_proj\Aman_bank300719\Agency_Banking_Rewamp\app\src\main\res\layout\activity_receive_money_security_task.xml
loc:183:68 - 183:87
****\ data binding error ****

this is my code
ActivityReceiveMoneySecurityTaskBinding binding;

this is my xml
`<data>
        <import type="android.view.View" />
<variable
            name="security_check" type="com.jmr.agency.banking.data.db.communication.CommTransaction" />
    </data>`

    public class CommTransaction extends CommAgent
                        implements Parcelable { 
        private Double txnAmount;
        private String transId; 
        // RefId 
        private String serverTxnId; 
        // CBS 
        private String dBranch; 
        private String cBranch;
        private String dAccountNo; 
        private String dName; 
        private String dLoc; 
        private String dCurrency
    }

并以这种方式使用:

getAndAssignToObject<T>(key: string, objectToAssign: T): Promise<T> {
  const data = await AppStorage.get<T>(key);
  Object.keys(data).forEach( dataKey => {
    // @ts-ignore
    objectToAssign[dataKey] = data[dataKey];
  });

  return data;
}

它可以按预期工作,但是如您所见,我确实有一个Helpers.getAndAssignToObject<BlockingConfig>(Components.BlockingRules, blockingData); 要删除。

删除时出现的错误是:

  

元素隐式地具有“ any”类型,因为类型“ string”的表达式不能用于索引“ unknown”类型。     在类型'unknown'上未找到参数类型为'string'的索引签名。ts(7053)

,我不知道如何解决。我尝试将@ts-ignore的类型设为dataKey,但没有用。

1 个答案:

答案 0 :(得分:1)

您需要断言Object.keys返回Array<keyof T>而不是Array<string>

async function getAndAssignToObject<T>(key: string, objectToAssign: T): Promise<T> {
  const data = await AppStorage.get<T>(key);
  (Object.keys(data) as Array<keyof T>).forEach(dataKey => {
    objectToAssign[dataKey] = data[dataKey];
  });

  return data;
}

Playground

这不是默认设置的原因已在here中进行了说明。从根本上说,例如objectToAssign可能具有比keyof T所建议的更多的属性,这可能会导致运行时错误。在这种情况下,您会将那些多余的键复制到data上,这在此功能中不是问题,但可能在其他地方引起问题。