我开始学习应用于节点JS后端的类型记录。目前,我仍然使用函数而不是类。我曾经为每个文件编写命名函数,如
const item= {
a:1,
b:2,
function1:()=>{
console.log(item.a)
},
function2:()=>{
console.log(item.b)
} }
然后导出它并像item.function1一样使用。(我有时也将其用作function1,并将导入作为非结构化对象)
现在,使用类型记录,我仍然使用这种方法,但类型。问题是,我不能将一个类型分配给a,因为它被看作是值。我不能说:
const item= {
function1:()=>{
item.a = 3
console.log(item.a)
},
function2:()=>{
item.b = 4
console.log(item.b)
}}
因为它说属性a或b在类型item中不存在。我试过的另一件事是:
const item = {
function1:()=>{
item.a:number = 3
console.log(item.a)
},
function2:()=>{
item.b:number = 4
console.log(item.b)
} }
有人能帮我吗?希望这个命名的函数不是编写代码的坏习惯。
发布于 2020-11-14 12:42:29
当您声明一个变量而不指定它的类型时,类型记录将尝试推断它的类型。当您分配一个对象时,它将试图推断出这样的类型:查看您编写的属性,并考虑对象只具有这些属性和您编写的对象所具有的类型。因此,在您的上一个代码示例中,类型记录将推断出item
是类型
const item: {
function1: () => void
function2: () => void
} = {
// ...
}
您可以看到它没有添加任何其他属性。
接下来,如果在键入对象时不声明属性,类型记录将认为该属性不存在,并且可能不存在于对象上。考虑到这一点:
const obj: { foo: number } = {
foo: 6
}
obj.bar = 7 // Error
您没有声明bar
属性,所以类型记录不允许读取它或给它分配一些东西。这就是为什么不能在示例中编写item.a = 3
的原因:类型记录没有推断item
对象具有属性a
,并且它认为它不存在
要解决这个问题,只需在创建对象时分配所需的所有属性:
const item = {
a: 1,
b: 2,
function1: () => { /* ... */ },
function2: () => { /* ... */ },
}
或手动键入item
interface Item {
a?: number
b?: number
function1: () => void
function2: () => void
}
const item: Item = {
function1: () => {
item.a = 3
},
function2: () => {
item.b = 4
}
}
注意界面内列之前的问号,这是为了说明这些属性是可选的。如果您不设置这些问号,类型记录会认为这是强制性的,所以如果创建item
并且不声明a
和b
属性,它会发出一个错误
发布于 2020-11-14 12:41:18
可以将项目object
表示为any
。
为了实现所需的一致性,可以定义如下接口
interface ItemObject {
[key: string]: any
}
var item: ItemObject= {};
使紧凑:
var item: {[k: string]: any} = {};
现在项可以接受任何字符串作为键,任何类型都可以接受为值。
https://stackoverflow.com/questions/64838299
复制