当使用解构赋值和变量作为属性名时,Typescript似乎失去了类型。
interface O {
[val: string]: string;
}
const o: O = {
foo: ''
};
const f = (name: string) => {
const {[name]: value} = o;
// now `value` has type any, how to make it type `string`?
const value1 = o[name] || '';
// and `value1` has correct type `string`
};

答案 0 :(得分:0)
我认为它的打字稿不是错误,此代码存在一些问题
const {[name]: value} = o ;
这一行是什么,你定义一个没有名字的const,然后使用类似的东西并分配o
还有什么是value
?
由于我不知道您的想法,我可以建议这些代码:
如果您想将其视为类型
const x : {[name:string]:string} = o;
如果您想将其用作值
const x = {[name] : 'my value'};
答案 1 :(得分:0)
修改强>
在考虑了一些之后,很明显两种情况都应该返回相同的结果,而typescript可能不会考虑对象的可能原型。所以它应该返回字符串类型。
您必须保护两个缺少条目和可能的非字符串原型访问的情况。
<强>原始强>
解构的值是string
,可以是任何字符串,包括 __proto__
或 { {1}} 会导致非constructor
类型。
如果您知道可能有的可选键,那么这将起作用:
string
我认为错误是在后一个例子中没有解构。通过传递某些字符串,您可能会获得非const f = (name: keyof typeof o) => {
const {[name]: value} = o;
// now `value` has type string
};
值。