형식 스크립트에서 사전 선언 및 초기화
다음 코드가 지정됩니다.
interface IPerson {
firstName: string;
lastName: string;
}
var persons: { [id: string]: IPerson; } = {
"p1": { firstName: "F1", lastName: "L1" },
"p2": { firstName: "F2" }
};
초기화가 거부되지 않는 이유는 무엇입니까?두 번째 개체에는 "lastName" 속성이 없습니다.
편집: 이 문제는 최신 TS 버전에서 수정되었습니다.OP 투고에 대한 @Simon_Weaver의 코멘트를 인용합니다.
참고: 이 문제는 이후 수정되었습니다(정확한 TS 버전은 알 수 없음).VS에서 다음과 같은 오류가 발생합니다.
Index signatures are incompatible. Type '{ firstName: string; }' is not assignable to type 'IPerson'. Property 'lastName' is missing in type '{ firstName: string; }'.
Apparently this doesn't work when passing the initial data at declaration. I guess this is a bug in TypeScript, so you should raise one at the project site.
다음과 같이 선언과 초기화로 예를 분할하여 입력된 사전을 사용할 수 있습니다.
var persons: { [id: string] : IPerson; } = {};
persons["p1"] = { firstName: "F1", lastName: "L1" };
persons["p2"] = { firstName: "F2" }; // will result in an error
typescript에서 사전 개체를 사용하는 경우 다음과 같이 인터페이스를 사용할 수 있습니다.
interface Dictionary<T> {
[Key: string]: T;
}
클래스 속성 유형으로 사용합니다.
export class SearchParameters {
SearchFor: Dictionary<string> = {};
}
이 클래스를 사용하고 초기화하려면
getUsers(): Observable<any> {
var searchParams = new SearchParameters();
searchParams.SearchFor['userId'] = '1';
searchParams.SearchFor['userName'] = 'xyz';
return this.http.post(searchParams, 'users/search')
.map(res => {
return res;
})
.catch(this.handleError.bind(this));
}
초기화 타입 체크 에러가 TypeScript 버그라는 thomaux의 의견에 동의합니다.그러나 올바른 유형 확인을 통해 하나의 문장에서 사전을 선언하고 초기화할 수 있는 방법을 찾고 싶었습니다.이 구현은 더 길지만 다음과 같은 추가 기능을 추가합니다.containsKey(key: string)
그리고.remove(key: string)
방법.0.9 릴리스에서 제네릭을 사용할 수 있게 되면 이 작업이 간소화 될 것으로 예상됩니다.
먼저 기본 사전 클래스와 인터페이스를 선언합니다.클래스에서 인터페이스를 구현할 수 없으므로 인덱서에 인터페이스가 필요합니다.
interface IDictionary {
add(key: string, value: any): void;
remove(key: string): void;
containsKey(key: string): bool;
keys(): string[];
values(): any[];
}
class Dictionary {
_keys: string[] = new string[];
_values: any[] = new any[];
constructor(init: { key: string; value: any; }[]) {
for (var x = 0; x < init.length; x++) {
this[init[x].key] = init[x].value;
this._keys.push(init[x].key);
this._values.push(init[x].value);
}
}
add(key: string, value: any) {
this[key] = value;
this._keys.push(key);
this._values.push(value);
}
remove(key: string) {
var index = this._keys.indexOf(key, 0);
this._keys.splice(index, 1);
this._values.splice(index, 1);
delete this[key];
}
keys(): string[] {
return this._keys;
}
values(): any[] {
return this._values;
}
containsKey(key: string) {
if (typeof this[key] === "undefined") {
return false;
}
return true;
}
toLookup(): IDictionary {
return this;
}
}
이제 개인 고유 유형과 사전/사전 인터페이스를 선언합니다.PersonDictionary 메모에서 재정의하는 방법values()
그리고.toLookup()
올바른 유형을 반환합니다.
interface IPerson {
firstName: string;
lastName: string;
}
interface IPersonDictionary extends IDictionary {
[index: string]: IPerson;
values(): IPerson[];
}
class PersonDictionary extends Dictionary {
constructor(init: { key: string; value: IPerson; }[]) {
super(init);
}
values(): IPerson[]{
return this._values;
}
toLookup(): IPersonDictionary {
return this;
}
}
다음으로 간단한 초기화 및 사용 예를 제시하겠습니다.
var persons = new PersonDictionary([
{ key: "p1", value: { firstName: "F1", lastName: "L2" } },
{ key: "p2", value: { firstName: "F2", lastName: "L2" } },
{ key: "p3", value: { firstName: "F3", lastName: "L3" } }
]).toLookup();
alert(persons["p1"].firstName + " " + persons["p1"].lastName);
// alert: F1 L2
persons.remove("p2");
if (!persons.containsKey("p2")) {
alert("Key no longer exists");
// alert: Key no longer exists
}
alert(persons.keys().join(", "));
// alert: p1, p3
이 경우 모든 필드가 존재해야 하므로 타이프스크립트가 실패합니다.이 문제를 해결하려면 Record 및 Partial 유틸리티 유형을 사용하십시오.
Record<string, Partial<IPerson>>
interface IPerson {
firstName: string;
lastName: string;
}
var persons: Record<string, Partial<IPerson>> = {
"p1": { firstName: "F1", lastName: "L1" },
"p2": { firstName: "F2" }
};
설명.
- 레코드 유형은 사전/해시맵을 만듭니다.
- 부분 유형은 일부 필드가 누락되었을 수 있다고 말합니다.
교대하는.
성을 옵션으로 하고 싶은 경우는, 「」를 추가할 수 있습니다.타자기본은 선택 사항임을 알 수 있습니다.
lastName?: string;
https://www.typescriptlang.org/docs/handbook/utility-types.html
@dmck에서 영감을 얻은 보다 일반적인 사전 구현 방법을 소개합니다.
interface IDictionary<T> {
add(key: string, value: T): void;
remove(key: string): void;
containsKey(key: string): boolean;
keys(): string[];
values(): T[];
}
class Dictionary<T> implements IDictionary<T> {
_keys: string[] = [];
_values: T[] = [];
constructor(init?: { key: string; value: T; }[]) {
if (init) {
for (var x = 0; x < init.length; x++) {
this[init[x].key] = init[x].value;
this._keys.push(init[x].key);
this._values.push(init[x].value);
}
}
}
add(key: string, value: T) {
this[key] = value;
this._keys.push(key);
this._values.push(value);
}
remove(key: string) {
var index = this._keys.indexOf(key, 0);
this._keys.splice(index, 1);
this._values.splice(index, 1);
delete this[key];
}
keys(): string[] {
return this._keys;
}
values(): T[] {
return this._values;
}
containsKey(key: string) {
if (typeof this[key] === "undefined") {
return false;
}
return true;
}
toLookup(): IDictionary<T> {
return this;
}
}
속성을 무시하려면 물음표를 추가하여 옵션으로 표시합니다.
interface IPerson {
firstName: string;
lastName?: string;
}
타이프스크립트에서도 쉽게 사전을 작성할 수 있는 방법을 찾고 있다면 Map 객체를 사용하는 것이 좋습니다.매뉴얼 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map. Map 객체에 대한 링크에는 모든 요소를 추가, 취득 및 삭제하기 위한 주요 방법이 있습니다.
dictionary= new Map<string, string>();
dictionary.set("key", "value");
dictionary.get("key");
dictionary.delete("key");
dictionary.clear(); //Removes all key-value pairs
Record <Tkey, Tobject>는 C# 사전처럼 기능합니다.
let myRecord: Record<string, number> = {};
//Add
myRecord[”key1”] = 1;
//Remove
delete myRecord[”key1"];
//Loop
for (var key in myRecord) {
var value = myRecord[key];
}
언급URL : https://stackoverflow.com/questions/15877362/declare-and-initialize-a-dictionary-in-typescript
'source' 카테고리의 다른 글
반응/축소 및 다국어(국제화) 애플리케이션 - 아키텍처 (0) | 2023.03.25 |
---|---|
ASP에 시간이 없는 날짜.NET Web API의 JSON 출력 (0) | 2023.03.25 |
모든 Spring Boot 액추에이터 엔드포인트에 프리픽스 추가 (0) | 2023.03.25 |
응용 프로그램을 시작하기 전에 @MockBean 구성 요소 구성 (0) | 2023.03.25 |
리퀴베이스 잠금 - 이유? (0) | 2023.03.25 |