我正在尝试在打字稿中设置一种类型,因此当您尝试访问未通过此访问类型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'];
答案 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'.
这是您想要的错误:“类型上不存在属性”。
另一种可能性是使用诸如ESLINT之类的linter,并使用诸如dot-notation
之类的规则,该规则根本不允许将字符串文字用作属性索引。
恐怕我不知道针对单个对象类型的任何更激烈的解决方案。您可能可以配置短毛猫,以便仅影响某些文件,这可能会或可能不够好。
好的,希望能有所帮助;祝你好运!