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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我如何在打字稿中定义这个对象?相关的知识,希望对你有一定的参考价值。

我有以下对象,我想强制执行谁的结构。

{
    '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 }这个物体的东西让我相信它的可能性。

我可以想到如何将它表示为一个集合,因为那将是一个对象数组,但我不知道我怎么能够将它描述为一个嵌套的对象结构。

答案

知道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'
    }
}
另一答案

好吧,你可以做到这一点。

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'
另一答案

您可以这样声明该类型的对象:

myObject: {
  'username': {
    required: string
  },
  'passwordGroup': {
    ocMatchFields: string;
  },
  'passwordGroup.password': {
    required: string
  },
  'passwordGroup.confirmPassword': {
    required: string
  }
}

这样你就可以这样做:

myObject.username, ...

那么你只有那个对象里面的属性。

你不能影响另一个具有usernamepasswordGroup等其他财产的物体......

另一答案

请在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';

用于声明Login对象数组的类型

let login: Login[];

我建议你创建一个Login类,用于在登录变量中插入数据。

另一答案

TypeScript 2.2引入了一种名为object的新类型。它表示任何非基本类型。以下类型被认为是javascript中的原始类型:

boolean
number
string
symbol
null
undefined

所有其他类型都被认为是非原始类型。新对象类型恰好代表:

所有原始类型

类型Primitive = |布尔值|号码|字符串|符号| null |不确定的;

所有非原始类型

type NonPrimitive = object;

让我们看看对象如何让我们编写更准确的类型声明。使用对象类型键入声明

随着TypeScript 2.2的发布,标准库的类型声明已经更新,以使用新的对象类型。例如,Object.create()和Object.setPrototypeOf()方法现在指定类型对象| null为其原型参数:

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

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

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

如何在打字稿中进行json操作[关闭]

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

如何在打字稿中定义一个常量数组

在打字稿中以自引用方式键入对象