객체 배열을 어떻게 정의 할 수 있습니까?


199

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

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

누군가 내가 유형을 올바르게 선언하는 방법을 말해 줄 수 있습니까? 인라인으로 할 수 있습니까, 아니면 두 가지 정의가 필요합니까?

xxx나중에 TypeScript userTestStatus[3].nammme에서 실수로 같은 것을 사용하면 경고 할 수 있도록 유형 선언으로 를 대체하려고합니다 .

답변:


283

번호와 비슷한 속성을 가진 객체 리터럴 대신 기본 배열을 사용하는 것이 좋습니다 . 따라서 번호를 매기고 (다른 많은 배열 함수도) 기성품을 처리합니다.

여기에서 찾고 있는 것은 배열의 모든 요소를 ​​정의하는 배열 의 인라인 인터페이스 정의입니다.

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 [...]

4
또한 다음과 같이 객체 배열을 선언 할 수 있습니다.let someArray: Array<{ id: number, name: string }> = []
— Alexander Kim

77

위의 것은 배열이 아닌 객체입니다.

배열을 사용 하여 객체를 둘러싸려면 [& ]를 사용 하십시오.

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" }
];

죄송하지만 내 질문이 명확하지 않을 수 있습니다. 내가하고 싶은 것은 userTestStatus에 대한 정의를 찾는 것이 었습니다.

1
@Marilou 일반적으로 userTestStatus선호하는 IDE에서 변수 위로 마우스를 가져 가면 간단히 정의를 얻을 수 있습니다 { id: number, name: string; }[]. TypeScript 플레이 그라운드가 표시 됩니다. 당신은 당신이 좋아하는 경우 인터페이스에서 그 래핑 수 interface NameThis { id: number, name: string; }와 NameThis[]배열 형식으로.
— Fenton

나는 이것을 시도했지만 몇 가지 오류가 발생합니다. 그러나 나는 그것이 내가 원하는 것과 같다고 생각한다. userTestStatus : {id : number, name : string; } [] = { "0": { "id": 0, "name": "사용 가능"}, "1": { "id": 1, "name": "Ready"},

를 정의하는 예제에서는 ; var arr: MyType과 같은 속성 이름 / 인덱스 선언을 사용하지 않습니다 "0": { … }. 이 시점에서 객체 리터럴을 사용하면됩니다.
— gfullam

@ gfullam 당신이 맞습니다, 나는 내 대답을 업데이트했습니다 (빠른 부주의 한 편집이었습니다)
— Brocco

36

일부 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" }
);

2
가장 실용적인 접근 방식. 간단한 어레이 사용 사례를위한 간단하고 직접적인 솔루션입니다. +1 받기
— Julio Vedovatto

18

정말로 원하는 것은 단순히 열거 일 수 있습니다.

열거 형처럼 행동하는 것을 찾고 있다면 (개체를 정의하고 순차적 ID 0, 1, 2를 첨부하고 철자가 원하지 않는 이름 필드가 포함되어 있기 때문에 (예 : 이름 대 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

위의 값은 "Available"에 대해 "0"과 같이 자동으로 매핑되며을 사용하여 액세스 할 수 있습니다 TestStatus.Available. 그리고 Typescript는 당신이 그것들을 전달할 때 타입을 강제합니다.

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

"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")
]

죄송하지만 내 질문이 명확하지 않을 수 있습니다. 내가하고 싶었던 것은 Typescript가 어디에서 사용되는지 확인할 수 있도록 userTestStatus에 대한 정의를 찾는 것이므로 예를 들어 userTestStatus [1] .naaaame을 입력 할 수 없었습니다.

"userTestStatus"와 "="사이에 넣을 것을 찾고 싶습니다. 변수가있는 유형을 말하기 위해 문자열이나 숫자를 넣을 수있는 것과 같은 방식으로. 브로코와 같은 것이 가능하지만 가능한 경우 한 줄만 사용하십시오.

-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와 같은 것


이것이 왜 문제를 해결하는지에 대한 자세한 정보를 제공해야합니다.
— Cornel Raiu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.