vue-i18n从JS转换为TS(vue js)
问题出现的原因是在使用interface/class定义时,无法使用object[prop]来获取属性值,会抛出错误。解决方法是使用keyof关键字来解决该问题,代码如下:
interface SomeInterface { propertyA: string; propertyB: string; } const object: SomeInterface = {propertyA: 'A', propertyB: 'B'}; for ( const prop in object ) { const value = object[prop]; // <-- 会抛出错误 const typedValue = object[prop as keyof SomeInterface]; // <-- 使用keyof关键字解决 }
另外一种解决方法是在interface/class中添加一个泛型属性,这样就可以通过object[prop]获取属性值了,但这会导致类型不安全。代码如下:
interface SomeInterface { propertyA: string; propertyB: string; [key: string]: any; }
以上的代码行`const typedValue = object[property as keyof SomeInterface]`也是解决该问题的关键。这行代码也帮助了我,谢谢!
在上述内容中,出现了一个"TS7053 Element implicitly has an 'any' type
"的错误。造成这个错误的原因是在通过数组访问方式访问属性时,元素的类型没有被明确指定。
解决这个问题的方法有以下几种:
解决方法1:隐式定义索引签名
const myObj: {[key: string]: any} = {}
const prop = 'propname'
myObj[prop] = 'string'
解决方法2:使用接口提供索引签名
interface IStringIndex {
[key: string]: any
}
const myObj: IStringIndex = {}
const prop = 'propname'
myObj[prop] = 'string'
解决方法3:使用接口并扩展<Record>
实用类型
interface IStringIndex extends Record<string, any> {}
const myObj: IStringIndex = {}
const prop = 'propname'
myObj[prop] = 'string'
解决方法4:使用类型别名定义索引签名
type MyObject = {
[key: string]: any
propname?: any
}
const myObj: MyObject = {}
const prop = 'propname'
myObj[prop] = 'string'
解决方法5:结合接口描述索引签名和类型别名描述有效属性
interface IStringIndex extends Record<string, any> {}
type MyObject = IStringIndex & {
propname?: string
}
const myObj: MyObject = {}
const prop = 'propname'
myObj[prop] = 'string'
解决方法6:定义有效的(字符串)属性名列表
type ValidProps = 'propname' | 'value'
interface IStringIndex extends Record<ValidProps, any> {}
const myObj: IStringIndex = {
propname: 'my prop',
value: 123
}
const prop = 'propname'
myObj[prop] = 'string'
需要注意的是,在分配对象时,ValidProps
列表中的所有属性都必须存在。
以上是解决"TS7053 Element implicitly has an 'any' type
"错误的几种方法,其中解决方法3是有效的。