TypeScript noPropertyAccessFromIndexSignature 不会影响对象字面量,

cbwuti44  于 3个月前  发布在  TypeScript
关注(0)|答案(7)|浏览(50)

Bug报告

🔎 搜索词

noPropertyAccessFromIndexSignature

🕗 版本与回归信息

4.2+

  • 我在每个版本中都尝试过这种行为

⏯ Playground链接

https://www.typescriptlang.org/play?noPropertyAccessFromIndexSignature=true#code/FAGwpgLgBBYM4QFxQN4G0CWA7AJmAHoggE7YDmAukRKVmQL5QC8qwU7UA9J1AO5h8AhlmgQAFhjgwA9lABGAgMaCArmTHQ5ATyhZpABWLSADmGIQtAQUWL4cAGJGAtgElcBAMoYyWQRBXEYAA08irQGOFwWADkEAB0bByCcorI0RLRQYnseABmaWJgICDSmcD0ANzAwIrSWHDS4HElZAAUsAhxyYoAlFW19Y1gzdJtHfF5fTV1DU0t7fAQaNHd0RRTA7PD8+PLeWt9QA

💻 代码

let test: {[index:string]:string} = {
    // we want this to be caught by noPropertyAccessFromIndexSignature, but it isn't.
    abc: 'hi',
    def: 'hello',
};

console.log(test.abc); // reported
console.log(test.def); // reported
console.log(test['abc']); // OK
console.log(test['def']);  // OK

🙁 实际行为

当分配给具有索引签名的类型时,允许未加引号的字符串键。

🙂 预期行为

应有一些机制来限制对象字面量的定义,以便只允许提供不带引号的命名属性({['somekey']: value}{'somekey':value})。这将防止逻辑错误并提高与Closure Compiler的ADVANCED优化的兼容性。

bjg7j2ky

bjg7j2ky1#

这将同时防止逻辑错误并提高与Closure Compiler的高级优化兼容性。
你能详细阐述一下这些动机吗?

9w11ddsr

9w11ddsr2#

我相信对于逻辑错误,我认为这与 noPropertyAccessFromIndexSignature 有相同的动机。对于 Closure Compiler 的高级优化模式,它根据属性是否被引用来区分可重命名(可优化)的属性。被引用和计算属性不会被重命名或符合优化条件,但 "." 访问/未引用的属性是。在这里 noPropertyAccessFromIndexSignature 很有帮助,因为它鼓励一致使用 "引用"。我们支持的一个团队正在寻找某种程度的对象字面量保护,以便分配给具有索引签名的类型。
https://developers.google.com/closure/compiler/docs/limitations#implications-of-global-variable,-function,-and-property-renaming:
您可能知道,Closure Compiler 在谷歌中被广泛使用。

5t7ly7z5

5t7ly7z53#

同样,对象解构赋值与属性访问相似,我预计解构索引签名也会给出错误:noPropertyAccessFromIndexSignature。

type Dictionary = Record<string, string>;

let test: Dictionary = {
    // we want this to be caught by noPropertyAccessFromIndexSignature, but it isn't.
    abc: 'hi',
    def: 'hello',
};

// This is equivalent to getting test.abc, so should be an error
const {abc} = test;
// This is preferred
const {'abc': abc1} = test;

https://www.typescriptlang.org/play?noPropertyAccessFromIndexSignature=true#code/FAFwngDgpgBAIgSwMYgQewHYEMBOYYC8MASlEmjgCYA8AziDghgOYA0M9jLAfANzDAANlBAwQUegC54yVJlz4iAb2Aw1MAPQaYAd1g6sGUSAAWCWmLQwARrCRYArsxOjr+DGgAKONNBzgAQSQkCVoAMR8AWwBJDEooAA8AZQRmbBAHHCh2awdRBHzaDAByEAA6VXUsayRpYrNi1kq1eIAzOpMoQUE0RuAAX35gLRgAFTMLcxgoAEcHBAA3LGEjSzEJcuqkdloTNAdBShtYQ2mcHxxgcgx6GCUt-sJ1+n5r26VireLpLYBGR6I4heAjeaGEZR6zAAFEDNjUAJSvTC0MFQCFoaGwsptRFXZGo9GYjYAbU+NWKAF1caDwZCYSTim1KYigA
Closure Compiler使用这些语法的所有引用来确定属性名称是否会被重命名。

wooyq4lh

wooyq4lh4#

@andrewbranch Where would I find the justification for noPropertyAccessFromIndexSignature ?

3phpmpom

3phpmpom5#

https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-2.html#--nopropertyaccessfromindexsignature. Following the link to the PR should turn up more discussion.

pwuypxnk

pwuypxnk6#

自从@Kingwl贡献了#40171以来,我猜想核心TypeScript团队可能不会对这个感兴趣。

0aydgbwb

0aydgbwb7#

根据我所知,@DanielRosenwasser对这个标志非常热情。就我个人而言,我认为它应该放在一个linter中。

相关问题