TypeScript,VSCode:切换到vscode的内部版本时,keyof类型无法正常工作

时间:2019-06-05 16:07:48

标签: reactjs typescript visual-studio-code

由于性能问题,我最近从VSCode切换到VSCode-Insiders(基本上是每晚构建),由于某种原因,我的代码中出现新的掉毛错误。我正在使用TypeScript 3.5.1版

以下是一个简化的示例:

  private updateTransaction = (
    k: 'description' | 'amount' | 'timestamp' | 'vendorId',
    v: ITransaction['description' | 'amount' | 'timestamp' | 'vendorId']
  ) => {
    if(this.state.selectedTransaction){
      this.state.selectedTransaction[k] = v;
    }
  };

其中ITransaction是:

export interface ITransaction {
  description: string;
  amount: number;
  timestamp: string;
  vendorId: number;
}

在切换到Insider构建之前,这不是错误,但是如果我在VSCode TypeScript的Insider版本中打开相同的项目,则会抱怨:

  

键入“字符串|数字”不能分配给“字符串和数字”类型。

     
    

“字符串”类型不能分配给“字符串和数字”类型。

         
      

“字符串”类型不能分配给“数字”类型。

    
  

有人可以帮助我了解这里的情况吗?我不确定这是否是VSCode内部人员构建中的错误,或者我的键入是否错误,并且此错误消息对我而言确实没有任何意义。我经常使用模式type KeyType = keyof InterfaceInterface[KeyType],但以前从未见过此错误消息。

I rebuilt a close approximation in the TS playground,但不再发生错误。如果我将其复制并粘贴到VSCode中,则会看到与上述相同的错误。我在想这意味着我应该把它作为一个github问题,但恐怕我遗漏了一些明显的东西

1 个答案:

答案 0 :(得分:3)

由于您使用的是vs代码的内部版本,因​​此您可能正在使用打字稿3.5。此版本具有breaking change

基本思想是,直到obj[k] = vk: keyof typeof obj中可能值的并集,打字稿才允许对v进行写操作,其中obj

let o = { nr: 0, str: "" }
declare let k: keyof typeof o;
o[k] = 0
o[k] = ""

这是不合理的。上面的示例在3.4及以下版本中适用,但是如果k'nr',则第二个赋值会将o置于无效状态。如果k'str',则第一个赋值会将对象置于无效状态。

简单的解决方案是使用类型断言:

function updateTransaction(k: TransactionKey, v: ITransaction[TransactionKey]) {
    if (testState.selectedTransaction) {
        testState.selectedTransaction[k] = v as any;
    }
}

这还是不完善的,但比以前还不完善。