我将如何在打字稿中定义这个对象?
Posted
技术标签:
【中文标题】我将如何在打字稿中定义这个对象?【英文标题】:How would I define this object in typescript? 【发布时间】:2018-06-07 00:01:36 【问题描述】:我有以下对象,我想强制执行谁的结构。
'username':
required: 'Please enter your username.'
,
'passwordGroup':
ocMatchFields: 'Passwords do not match'
,
'passwordGroup.password':
required: 'Please enter your password'
,
'passwordGroup.confirmPassword':
required: 'Please confirm your password'
它永远不会比显示的嵌套更深,并且值将始终是字符串,但可以有任意数量的“字段”。在这种情况下,字段是第一级键。用户名、密码组等
我遇到了将对象描述为 [key: string]: boolean
的东西,这让我相信它是可能的。
我可以考虑如何将它表示为一个集合,因为那将是一个对象数组,但我不确定如何将它描述为一个嵌套对象结构。
【问题讨论】:
单个对象是否将包含一对用户名和密码组? 是的,没错 enforcing-the-type-of-the-indexed-members-of-a-typescript-object 【参考方案1】:了解 TypeScript,我可能忽略了一些很棒的语法。但这里有一种方法:
interface StringToString [key: string]: string ;
interface MyNested [key: string]: StringToString ;
let x: MyNested =
'username':
required: 'Please enter your username.'
,
'passwordGroup':
ocMatchFields: 'Passwords do not match'
,
'passwordGroup.password':
required: 'Please enter your password'
,
'passwordGroup.confirmPassword':
required: 'Please confirm your password'
请注意,上述内容不会阻止嵌套对象拥有多个键。
或者你可以得到超级通用(但它可能是矫枉过正):
interface KeyValuePair<T> [key: string]: T ;
let x: KeyValuePair<KeyValuePair<string>> =
'username':
required: 'Please enter your username.'
,
'passwordGroup':
ocMatchFields: 'Passwords do not match'
,
'passwordGroup.password':
required: 'Please enter your password'
,
'passwordGroup.confirmPassword':
required: 'Please confirm your password'
【讨论】:
【参考方案2】:嗯,你可以这样做。
export default [
'username':
required: 'Please enter your username.'
,
'passwordGroup':
ocMatchFields: 'Passwords do not match'
,
'passwordGroup.password':
required: 'Please enter your password'
,
'passwordGroup.confirmPassword':
required: 'Please confirm your password'
]
稍后,在您的打字稿控制器上,您可以将其导入为您想要调用的任何名称
import nameYouWant from 'adrees-file-src-exist-json'
【讨论】:
【参考方案3】:您可以这样声明该类型的对象:
myObject:
'username':
required: string
,
'passwordGroup':
ocMatchFields: string;
,
'passwordGroup.password':
required: string
,
'passwordGroup.confirmPassword':
required: string
这样你就可以做到:
myObject.username, ...
你只有那个对象内的那些属性。
您不能影响另一个具有username
或passwordGroup
等属性的对象...
【讨论】:
通用结构确实是我想要建模的,我给出的对象只是一个例子。我不提前知道对象的属性是什么。 很好,我已经多次使用这种方式,因为我需要一个只有预定义属性的对象。 是的,在那个用例中这完全有道理。感谢您的时间和回答。【参考方案4】:请在 LoginInterface.ts 中声明这些类型
export interface IfcRequired
required: String;
export interface IfcOCMatchFields
ocMatchFields: String;
export interface Login
username: IfcRequired;
password: IfcOCMatchFields;
passwordGroup.password: IfcRequired;
passwordGroup.confirmPassword: IfcRequired;
要使用这些接口,请使用
import IfcRequired, IfcOCMatchFields, Login from 'LoginInterface';
用于声明登录对象数组的类型
let login: Login[];
我建议你创建一个登录类,用于在登录变量中插入数据。
【讨论】:
如果我们提前知道属性名称,这可能是可行的方法,但我假设我们不知道它们 @FrankModica,如果我们不确定字段名称,那么我们肯定应该使用可以是对象、数组等任何类型的通用类型。在这种情况下,不会为变量声明类型多有成果。 在不知道属性名称的情况下,您仍然可以将键限制为任何字符串或数字(这是 TypeScript 允许作为键的唯一两种类型),并且您可以将值限制为某种类型 key 在对象中只能采用字符串类型。如果我们将键作为数字传递,那么如果对象尚未初始化,JS 会将其视为数组。虽然我们当然可以定义值的类型。 我相信当用作对象的键时将数字转换为字符串(在运行时)是正确的(尽管 TypeScript 仍然允许您在开发时将键键入为数字)。但我不相信如果你使用数字作为索引,JS 不会将未初始化的对象视为数组。例如,如果您尝试使用let val of arr
语法迭代对象,它将不起作用。它也没有.length
属性等。但也许我误解了?【参考方案5】:
TypeScript 2.2 引入了一种名为 object 的新类型。它代表任何非原始类型。以下类型被认为是 javascript 中的原始类型:
boolean
number
string
symbol
null
undefined
所有其他类型都被认为是非原始类型。新的对象类型正好代表这些:
所有原始类型
类型原始= |布尔值 |数字 |细绳 |象征 |空值 |未定义;
所有非原始类型
类型 NonPrimitive = 对象;
让我们看看 object 如何让我们编写更准确的类型声明。 使用对象类型的类型声明
随着 TypeScript 2.2 的发布,标准库的类型声明已更新为使用新的对象类型。例如,Object.create() 和 Object.setPrototypeOf() 方法现在指定类型 object |其原型参数为 null:
【讨论】:
您在复制粘贴时错过了“T”!以上是关于我将如何在打字稿中定义这个对象?的主要内容,如果未能解决你的问题,请参考以下文章