由于性能问题,我最近从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 Interface
和Interface[KeyType]
,但以前从未见过此错误消息。
I rebuilt a close approximation in the TS playground,但不再发生错误。如果我将其复制并粘贴到VSCode中,则会看到与上述相同的错误。我在想这意味着我应该把它作为一个github问题,但恐怕我遗漏了一些明显的东西
答案 0 :(得分:3)
由于您使用的是vs代码的内部版本,因此您可能正在使用打字稿3.5。此版本具有breaking change。
基本思想是,直到obj[k] = v
是k: 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;
}
}
这还是不完善的,但比以前还不完善。