通过括号访问密钥时如何将密钥限制为打字稿中定义的密钥

时间:2020-03-24 16:20:00

标签: typescript

我正在尝试在打字稿中设置一种类型,因此当您尝试访问未通过此访问类型exampleVar['test string']定义的属性时,它会出错。

例如

type Account = {
  accountInfo: accountInfo;
  key: number;
}

type accountInfo = {
  'Date Reported'?: string | null;
  'Status': string | null;
}

const testAccount: Account = {
  accountInfo: {},
  key: 1
}

// This gives me a typescript error (which is expected)
testAccount.accountInfo.randomKey;

// This does not give me a typescript error (which is expected)
testAccount.accountInfo.Status;

// This does not give me a typescript error (when I want one)
testAccount.accountInfo['hello test'];

1 个答案:

答案 0 :(得分:2)

理想情况下,应尽可能在TypeScript中使用--strict compiler option。不幸的是,默认情况下不执行此操作以支持较旧的项目,因为TypeScript的许多优点来自这些严格的检查。无论如何,负责此操作的特定编译器选项将为--noImplicitAny

编译器有意允许括号索引访问绕过常规属性检查。但是,如果您执行了这样的索引操作并且该属性中不存在该键,则编译器会将该属性的类型推断为any。并且--noImplicitAny会发出警告,因为您得到的是any而未加注释:

testAccount.accountInfo['hello test'];
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Element implicitly has an 'any' type because expression of type '"hello test"' 
// can't be used to index type 'accountInfo'.  Property 'hello test' does not exist 
// on type 'accountInfo'.

Link to code

这是您想要的错误:“类型上不存在属性”。


另一种可能性是使用诸如ESLINT之类的linter,并使用诸如dot-notation之类的规则,该规则根本不允许将字符串文字用作属性索引。


恐怕我不知道针对单个对象类型的任何更激烈的解决方案。您可能可以配置短毛猫,以便仅影响某些文件,这可能会或可能不够好。


好的,希望能有所帮助;祝你好运!