programing

객체 배열을 정의하려면 어떻게 해야 합니까?

topblog 2023. 2. 22. 21:31
반응형

객체 배열을 정의하려면 어떻게 해야 합니까?

TypeScript에서 객체 배열을 만들고 있습니다.

 userTestStatus xxxx = {
    "0": { "id": 0, "name": "Available" },
    "1": { "id": 1, "name": "Ready" },
    "2": { "id": 2, "name": "Started" }
 };

어떻게 하면 정확한 유형을 신고할 수 있는지 누가 알려주시겠어요?인라인화가 가능합니까, 아니면 두 가지 정의가 필요합니까?

대체품을 찾고 있습니다.xxx나중에 TypeScript에서 다음과 같은 것을 사용했을 때 경고할 수 있도록 TypeScript를 선언합니다.userTestStatus[3].nammme잘못해서

숫자와 같은 속성을 가진 객체 리터럴 대신 네이티브 어레이를 사용하는 것이 좋습니다.그러면 번호부여(및 다른 수많은 어레이 함수)가 기성품으로 처리됩니다.

여기에서는 어레이의 인라인인터페이스 정의를 나타냅니다.이 정의에서는 어레이 내의 모든 요소를 정의합니다.이 요소는 처음에 존재하든 나중에 도입하든 상관없습니다.

let userTestStatus: { id: number, name: string }[] = [
    { "id": 0, "name": "Available" },
    { "id": 1, "name": "Ready" },
    { "id": 2, "name": "Started" }
];

userTestStatus[34978].nammme; // Error: Property 'nammme' does not exist on type [...]

배열을 바로 값으로 초기화할 경우 명시적 유형 정의는 필요하지 않습니다.TypeScript는 초기 할당에서 대부분의 요소 유형을 자동으로 추론할 수 있습니다.

let userTestStatus = [
    { "id": 0, "name": "Available" },
    ...
];

userTestStatus[34978].nammme; // Error: Property 'nammme' does not exist on type [...]

위에 있는 것은 배열이 아니라 객체입니다.

배열을 사용하려면[&]에워싸고 있습니다.

userTestStatus = [
  { "id": 0, "name": "Available" },
  { "id": 1, "name": "Ready" },
  { "id": 2, "name": "Started" }
];

TypeScript는 JavaScript의 슈퍼셋이기 때문에 유효한 JavaScript는 TypeScript가 되기 때문에 다른 변경이 필요하지 않습니다.

OP로부터의 피드백 설명...게시된 모델에 대한 정의가 필요하다

여기서 정의한 유형을 사용하여 객체 모델을 나타낼 수 있습니다.

type MyType = {
    id: number;
    name: string;
}

type MyGroupType = {
    [key:string]: MyType;
}

var obj: MyGroupType = {
    "0": { "id": 0, "name": "Available" },
    "1": { "id": 1, "name": "Ready" },
    "2": { "id": 2, "name": "Started" }
};
// or if you make it an array
var arr: MyType[] = [
    { "id": 0, "name": "Available" },
    { "id": 1, "name": "Ready" },
    { "id": 2, "name": "Started" }
];

몇개tslint규칙에서 [] 사용을 디세블로 하고 있습니다.예:Array type using 'T[]' is forbidden for non-simple types. Use 'Array<T>' instead.

그런 다음 다음과 같이 적습니다.

var userTestStatus: Array<{ id: number, name: string }> = Array(
    { "id": 0, "name": "Available" },
    { "id": 1, "name": "Ready" },
    { "id": 2, "name": "Started" }
);

Array<T>

person: Array<{
  name: string;
  age: number;
}>

당신이 정말로 원하는 것은 단순히 열거일 수도 있다.

열거형처럼 동작하는 것을 찾고 있는 경우(개체를 정의하여 순차 ID 0, 1, 2를 부가하고 있으며, 이름 필드(예: name vs naaame)를 잘못 입력하고 싶지 않은 이름 필드가 포함되어 있는 것을 알 수 있으므로 열거형을 정의하는 것이 좋습니다.순차 ID는 자동으로 관리되고 유형 검증 기능이 제공되기 때문입니다.바로 사용할 수 있습니다.

enum TestStatus {
    Available,     // 0
    Ready,         // 1
    Started,       // 2
}

class Test {
    status: TestStatus
}

var test = new Test();
test.status = TestStatus.Available; // type and spelling is checked for you,
                                    // and the sequence ID is automatic

위의 값은 자동으로 매핑됩니다(예: "사용 가능"의 경우 "0").TestStatus.AvailableTypescript는 사용자가 그것들을 전달할 때 유형을 적용합니다.

새 유형을 사용자 지정 유형의 배열로 정의해야 하는 경우

오브젝트 배열( "0", "1" 및 "2"를 가진 오브젝트는 아님)이 필요하기 때문에 오브젝트 유형을 먼저 정의하고 다음으로 포함하는 어레이 유형을 정의합니다.

class TestStatus {
    id: number
    name: string

    constructor(id, name){
        this.id = id;
        this.name = name;
    }
}

type Statuses = Array<TestStatus>;

var statuses: Statuses = [
    new TestStatus(0, "Available"),
    new TestStatus(1, "Ready"),
    new TestStatus(2, "Started")
]

조금 낡았지만 나는 이것에 명료함을 더해줄 수 있을 것 같았다.

정확한 답변

    interface MyObject {
      id: number;
      name: string;
    }

    interface MyExactData {
      [key: string]: MyObject;
    }

    let userTestStatus: MyExactData = {
      "0": { "id": 0, "name": "Available" },
      "1": { "id": 1, "name": "Ready" },
      "2": { "id": 2, "name": "Started" }
    };

그러나 위의 방법은 보통 객체 배열을 수행하는 방식이 아닙니다. JavaScript에서는 단순한 네이티브 배열을 사용합니다.

    interface MyObject { // define the object (singular)
      id: number;
      name: string;
    }

    let userTestStatus_better: MyObject[] = [
      { "id": 0, "name": "Available" },
      { "id": 1, "name": "Ready" },
      { "id": 2, "name": "Started" }
    ];

말하면, simply만면하하 simply simply simply simply simply simply simply 。[]인터페이스에는, 상기의 오브젝트 배열의 타이핑이 준비되어 있습니다.을 인라인으로 하기

    let userTestStatus_inline: {id:number, name:string}[] = [
      { "id": 0, "name": "Available" },
      { "id": 1, "name": "Ready" },
      { "id": 2, "name": "Started" }
    ];

정의, 이해, 재사용이 가능한 것이 있기 때문에 인터페이스를 사용합니다.변경이 필요한 경우 1개의 인터페이스를 변경할 수 있습니다.타입 스크립트는 인터페이스의 코드 불일치를 보고합니다.

시험해 볼 수도 있습니다.

    interface IData{
        id: number;
        name:string;
    }

    let userTestStatus:Record<string,IData> = {
        "0": { "id": 0, "name": "Available" },
        "1": { "id": 1, "name": "Ready" },
        "2": { "id": 2, "name": "Started" }
    };

레코드의 동작에 대해서는, https://www.typescriptlang.org/docs/handbook/utility-types.html#recordkt 를 참조해 주세요.

이 경우 레코드는 키가 문자열이고 값이 IData 유형인 객체를 선언하기 위해 사용됩니다.이것에 의해, 그 속성에 액세스 하려고 하면, 인텔리센스를 얻을 수 있게 되어, userTestStatus[0.nameee]와 같은 것을 시도하려고 하면, 타입 에러가 발생합니다.

 var xxxx : { [key:number]: MyType };

언급URL : https://stackoverflow.com/questions/35435042/how-can-i-define-an-array-of-objects

반응형