【问题标题】:Typescript loose typing in destructuring assignment解构赋值中的打字稿松散类型
【发布时间】:2018-06-08 23:03:01
【问题描述】:

当使用解构赋值和变量作为属性名称时,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`
};

【问题讨论】:

  • 这实际上看起来像是 TypeScript 中的一个错误,我建议你在他们的问题中搜索,如果没有找到,请打开一个。
  • a bug
  • 我遇到了 Angular 2 的一些问题。如果您尝试从对象表示法分配,则类型会变得混乱。

标签: typescript types destructuring


【解决方案1】:

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

const {[name]: value} = o ;

这一行是什么,你定义了一个没有名字的 const,然后使用 type 之类的东西并分配 o

还有value是什么?

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

如果你想把它当作类型

const x : {[name:string]:string} = o;

如果你想用它作为值

const x = {[name] : 'my value'};

【讨论】:

    【解决方案2】:

    编辑:

    再想一想,很明显两种情况都应该返回相同的结果,并且打字稿可能没有考虑对象的可能原型。所以它应该返回字符串类型。

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

    原文:

    解构的值是string,可以是任何字符串,包括__proto__constructor em> 这将导致非 string 类型。

    如果您知道您可能拥有的可选键,那么这将起作用:

    const f = (name: keyof typeof o) => {
        const {[name]: value} = o;
        // now `value` has type string
    };
    

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

    【讨论】:

      猜你喜欢
      • 2020-04-19
      • 2019-12-12
      • 1970-01-01
      • 2017-01-16
      • 2019-09-18
      • 1970-01-01
      • 2020-07-26
      • 1970-01-01
      • 2017-04-10
      相关资源
      最近更新 更多