首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解构赋值中的Typescript松散类型

解构赋值中的Typescript松散类型
EN

Stack Overflow用户
提问于 2017-12-28 19:37:58
回答 2查看 863关注 0票数 4

当使用析构赋值和变量作为属性名时,Typescript似乎会丢失类型。

代码语言:javascript
复制
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`
};

EN

回答 2

Stack Overflow用户

发布于 2017-12-28 22:40:35

我不认为这是typescript的错误,这段代码有一些问题

代码语言:javascript
复制
const {[name]: value} = o ;

这一行是什么,您正在定义一个没有名称的const,然后使用类型和赋值o之类的东西

另外,什么是value

由于我不知道你的想法是什么,我可以建议这些代码:

如果您希望将其视为类型

代码语言:javascript
复制
const x : {[name:string]:string} = o;

如果你想把它当做值使用

代码语言:javascript
复制
const x = {[name] : 'my value'};
票数 0
EN

Stack Overflow用户

发布于 2017-12-29 02:22:07

编辑:

经过更多的思考,很明显,这两种情况都应该返回相同的结果,并且typescript可能没有考虑到对象的可能原型。所以它应该返回字符串类型。

而且您必须保护两种情况,即丢失条目和可能的非字符串原型访问。

原创:

解构的值是一个string,可以是任何字符串,包括将导致非string类型的__proto__constructor之类的内容。

如果你知道你可能拥有的可选密钥,那么这将会起作用:

代码语言:javascript
复制
const f = (name: keyof typeof o) => {
    const {[name]: value} = o;
    // now `value` has type string
};

我认为bug在后一个例子中没有解构。通过传递某些字符串,您可能会得到一个非string值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48006779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档