打字稿中的打字稿松散打字

问题描述 投票:4回答:2

当使用解构赋值和变量作为属性名时,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 types destructuring
2个回答
0
投票

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

const {[name]: value} = o ;

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

还有什么是value

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

如果你想把它当作类型

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

如果要将其用作值

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

0
投票

编辑:

在考虑了一些之后,很明显两种情况都应该返回相同的结果,而typescript可能不会考虑对象的可能原型。所以它应该返回字符串类型。

并且您必须保护两个缺少条目和可能的非字符串原型访问的情况。

原版的:

给予解构的值是string,可以是任何字符串,包括__proto__constructor之类的东西,这将导致非string类型。

如果你知道你可能有的可选键,那么这将有效:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.