解构赋值中的打字稿松散类型

Posted

技术标签:

【中文标题】解构赋值中的打字稿松散类型【英文标题】: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 的一些问题。如果您尝试从对象表示法分配,则类型会变得混乱。 【参考方案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 值。

【讨论】:

以上是关于解构赋值中的打字稿松散类型的主要内容,如果未能解决你的问题,请参考以下文章

打字稿和嵌套解构

使用打字稿在reduce方法中使用扩展语法进行解构

ES6解构赋值+字符串的扩展

es6中的解构赋值

数组解构

ES6解构赋值有这一篇就够了