当使用析构赋值和变量作为属性名时,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`
};
发布于 2017-12-28 22:40:35
我不认为这是typescript的错误,这段代码有一些问题
const {[name]: value} = o ;这一行是什么,您正在定义一个没有名称的const,然后使用类型和赋值o之类的东西
另外,什么是value
由于我不知道你的想法是什么,我可以建议这些代码:
如果您希望将其视为类型
const x : {[name:string]:string} = o;如果你想把它当做值使用
const x = {[name] : 'my value'};发布于 2017-12-29 02:22:07
编辑:
经过更多的思考,很明显,这两种情况都应该返回相同的结果,并且typescript可能没有考虑到对象的可能原型。所以它应该返回字符串类型。
而且您必须保护两种情况,即丢失条目和可能的非字符串原型访问。
原创:
解构的值是一个string,可以是任何字符串,包括将导致非string类型的__proto__或constructor之类的内容。
如果你知道你可能拥有的可选密钥,那么这将会起作用:
const f = (name: keyof typeof o) => {
const {[name]: value} = o;
// now `value` has type string
};我认为bug在后一个例子中没有解构。通过传递某些字符串,您可能会得到一个非string值。
https://stackoverflow.com/questions/48006779
复制相似问题