2016-08-03 7 views
4

클래스 속성을 설정하기 위해 여러 줄의 코드를 작성할 필요가 없도록 TypeScript에서 MyClass에 여러 속성을 동적으로 할당하고 싶습니다. 나는 오류가있는 라인 this[key] = value;에 문제가있다,TypeScript에서 클래스 속성에 동적으로 값을 할당하는 방법

interface IMy 
{ 
    visible?: boolean; 
    text?: string; 
} 

class MyClass 
{ 
    element: JQuery; 

    assing(o: IMy): void 
    { 
     for (let [key, value] of Object.entries(o)) 
     { 
      if (typeof value !== "undefined") 
       this[key] = value; 
     } 
    } 

    get visible(): boolean 
    { 
     return this.element.is(":visible"); 
    } 

    set visible(visible: boolean) 
    { 
     this.element.css("display", visible ? "" : "none"); 
    } 

    get text(): string 
    { 
     return this.element.html(); 
    } 

    set text(text: string) 
    { 
     this.element.html(text); 
    } 
} 

let t = new MyClass(); 
t.assign({ visible: true }); 
//instead t.visible = true; 

//or 

t.assign({ text: "Something" }); 
//instead t.text = "something"; 

//or 

t.assign({ text: "Something", visible: false }); 
//instead t.visible = true; 
//  t.text = "something"; 

:하지만 나는 다음과 같은 코드를 작성

Index signature of object type implicitly has an 'any' type.

내가 변경할 필요가 또는 나의 접근 방식은 완전히 잘못입니까?
인터페이스가 생성자 매개 변수 일 때 생성자에서 기본 속성을 설정하는 좋은 해결책이 될 수도 있습니다. 정말 그들이 내가이 코드를 사용하고 좋아하는 항목에 대한
:

//extensions.d.ts 
interface Object 
{ 
    entries<T>(o: any): [string, T][]; 
    entries(o: any): [string, any][]; 
} 
//exntesion.js !!note js not ts 
if (!Object.entries) 
{ 
    Object.entries = function* entries(obj) 
    { 
     for (let key of Object.keys(obj)) 
     { 
      yield [key, obj[key]]; 
     } 
    }; 
} 

편집 2 :

편집은

주요 아이디어는 생성자 곳 과부하 문제를 해결하는 것이 었습니다 원하는 속성 만 설정할 수 있습니다.
다른 사람이 사용할 수 있다고 판단되면 완전한 코드가 표시됩니다.

interface IMy 
{ 
    prop1?: boolean; 
    prop2?: string; 
    prop3?: string; 
    prop4?: number; 
} 

class MyClass implements IMy 
{ 
    prop1: boolean = false; 
    prop2: string = ""; 
    prop3: string = "Something"; 
    prop4: number = 0; 

    constructor(properties: IMy) 
    { 
     this.assing(properties); 
    } 

    assing(o: IMy): void 
    { 
     let that = (<any>this); 
     for (let key in o) 
     { 
      if (o.hasOwnProperty(key)) 
      { 
       let value = (<any>o)[key]; 
       if (typeof value !== "undefined" && typeof that[key] !== "undefined") 
        that[key] = value; 
      } 
     } 
    } 

} 

let my1 = new MyClass({ prop1: true }); 
let my2 = new MyClass({ prop2: "SomeText", prop3: "Anything" }); 
//I set prop2 and prop3 
let my3 = new MyClass({ prop4: 10 });  
//I set prop4 (fourth parameter) 

console.log(my1, my2, my3); 

답변

5

오류 자체는 --noImplicitAny 컴파일러 옵션에서 비롯됩니다. 제거하면 오류가 사라집니다. 그러나 나는 그것이 나쁜 것이 아니라고 믿습니다.

key에 형식 주석을 추가해야합니다 (seems not to be problematicfor .. of 루프).

나는 접근 방식이 나쁘지는 않지만 속성에 대해 반복적으로 다르게 다시 작성해야한다고 생각한다.

여담으로

, 난 당신이 ES6을 대상으로합니다 alse (컴파일러에 대한 ES6 feature처럼 보이는 약 .entries()을 불평하지 않은 가정이 배열이 아닌 개체에 대한처럼 그것은 보이는

편집 :..

다른 SO answer에서 영감을

- 오류가 멀리 갈 수 있도록, 당신과 같이, any에 캐스트를 추가 할 수 있습니다

(<any>this)[key] = value; 

.entries()을 사용하는 방법에 대한 위는 여전히 적용, 그대는 gh.

1

TypeScript 2.1보다 나은 접근 방식은 keyof and Mapped Types입니다.

function test() 
{ 
    const my = new MyClass(); 
    my.assign({ prop1: 3}); 
} 


type MyClassPartial = { 
    [P in keyof MyClass]?: MyClass[P]; 
}; 

class MyClass 
{ 
    prop1: number; 
    prop2: string; 
    assign(props: MyClassPartial) 
    { 
     for (const key of Object.keys(props)) 
     { 
      this[key] = props[key]; 
     } 
    } 
} 

You get some intellisense

관련 문제