Typescript 打字稿';字典';对象与具有已知成员的对象的类型访问器?

Typescript 打字稿';字典';对象与具有已知成员的对象的类型访问器?,typescript,Typescript,我在网上视频课程之后学习TypeScript——我的背景是“结构化”类型语言(C,ActionScript 3),但TypeScript中的一些内容对我来说是新的 我特别想了解对象的“dictionary”类型 interface dict { [accessString: string]: { name: string; address: string } | undefined } 所以我在这里说的是,一个依附于接口的对象将接受访问,比如 const userD

我在网上视频课程之后学习TypeScript——我的背景是“结构化”类型语言(C,ActionScript 3),但TypeScript中的一些内容对我来说是新的

我特别想了解对象的“dictionary”类型

interface dict {
  [accessString: string]: {
     name: string;
     address: string
  } | undefined
}
所以我在这里说的是,一个依附于接口的对象将接受访问,比如

const userData = myObject['someString']
const userData2 = myObject.someString
userData
userData2
将是同一个对象,其中包含
name
address
字段,对吗?或者这个字段可能不存在于对象上,在这种情况下,我们会得到未定义的
?(这就是为什么有必要在接口定义中添加
| undefined

嗯。但从概念上讲,这与下面的对象接口定义有何不同

interface notDict {
   someString: {
         name: string;
         address: string
}
在本例中,我们是说我们知道对象上有一个名为
someString
的字段,而在我们最初的“字典类型”定义中,我们没有对字段是什么表示任何意见?
[accessString:string]:{}
定义和
普通对象
定义之间还有其他区别吗?还是我看得不对


谢谢你的指导

你基本上都记下来了。最大的区别是:

  • interface-Dict
    允许您根据需要命名父对象,而
    interface-notDict
    强制父对象的名称为
    someString
  • Dict
    类型可以是空对象,
    notDict
    类型始终需要所有字段
  • Dict
    类型定义为非空对象后,所有字段都是必需的。(您可以在键后使用
    (例如
    名称?:…
    )来绕过此问题)

  • 参见示例。

    另一个细节是,字典类型表示有0个或多个键,而当您显式声明键时,您也显式说明对象将有多少成员。谢谢——在您的示例中,当您有
    const a3:dict={anyStringName:{name:'hello'}//一旦定义了对象,所有键都是必需的
    -“所有键都是必需的”在这里是什么意思?它意味着需要对象
    中的键
    名称
    地址