我将如何在打字稿中定义这个对象?

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, ...

你只有那个对象内的那些属性。

您不能影响另一个具有usernamepasswordGroup 等属性的对象...

【讨论】:

通用结构确实是我想要建模的,我给出的对象只是一个例子。我不提前知道对象的属性是什么。 很好,我已经多次使用这种方式,因为我需要一个只有预定义属性的对象。 是的,在那个用例中这完全有道理。感谢您的时间和回答。【参考方案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”!

以上是关于我将如何在打字稿中定义这个对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何将方法的泛型类型限制为打字稿中的对象?

如何在打字稿中过滤对象数组

如何将对象数组转换为在打字稿中具有动态键的单个对象

在打字稿中向对象数组插入新值

如何在打字稿中键入枚举变量?

如何在打字稿中组合对象属性?