【发布时间】:2018-08-25 00:05:52
【问题描述】:
在previous question 中,我询问了如何分配对象的值和对象的键。现在我已经实现了它,第一个函数在使用keyof 时工作正常,但第二个函数不允许我打开key 来缩小类型。
以下是相关行旁边有 cmets 的示例代码。
type JWT = { id: string, token: string, expire: Date };
const obj: JWT = { id: 'abc123', token: 'tk01', expire: new Date(2018, 2, 14) };
function print(key: keyof JWT) {
switch (key) {
case 'id':
case 'token':
console.log(obj[key].toUpperCase());
break;
case 'expire':
console.log(obj[key].toISOString()); // Works!
break;
}
}
function onChange<K extends keyof JWT>(key: K, value: JWT[K]) {
switch (key) {
case 'id':
case 'token':
obj[key] = value + ' (assigned)';
break;
case 'expire':
obj[key] = value.toISOString(); // Error!
break;
}
}
如何实现onChange 函数,以便开关缩小类似于上面print 函数的类型?
【问题讨论】:
-
这是一个design limitation,TypeScript 只缩小了切换的
key的类型,而不是K或value的相关类型。简短的回答可能是在这种情况下您只需要断言(value as Date).toISOString()。 -
嗯,当然,
obj[key]应该是Date而不是string在这种情况下无论如何。
标签: typescript types