2015-01-18 5 views
1

key의 값을 과 같은 속성으로 가질 수 있으므로 다음 getter 함수는 매우 유용하고 재사용 가능합니다. TypeScript에서 setter 함수를 정의하는 방법이 있습니까?

export function keyOf<a>(value: { key: a; }) : a { 
    return value.key; 
} 

마찬가지로 나는 보편적 인 setter 함수를 정의 할 수 있습니다

export function withKey<a>(value: { key: a; }, key: a) : void { 
    value.key = key; 
} 

유일한 문제는 대신 void을 반환하는 내가 수정 key 속성을 원래 개체 value를 반환 할 필요는 것이다. 이 같은 것은 :

export function withKey<b, a extends { key: b }>(value: a, key: b) : a { 
    value.key = key; 
    return value; 
} 

그러나 이것은 유효한 TypeScript 코드가 아닙니다.

질문 : 어떻게 그 속성이 설정된 원래 개체를 반환하는 typesafe 범용 setter 함수를 얻을 수 있습니까?

는 UPDATE : 유형 매개 변수의 현재 타이프 라이터 종속성에서

는 금지되어 있습니다. 나는 그것이 타입 시스템을 더 간단하고 빠르게 만드는 것으로 생각된다. 그러나이 제한은 문제의 시나리오와 같은 유용한 시나리오를 방지합니다. 함수 적 종속성에 입력 매개 변수 간의 종속성을 설정할 수 있습니다 해킹이있다 :

export function withKey<a, b>(
    value: a, 
    key: b, 
    toAssignable: (value: a) => { key: b } = function<c>(anything: c) : c { 
     return anything; 
    } 
) : a { 
    toAssignable(value).key = key; 
    return value; 
} 

이 지옥으로 추한 외모와 원래의 서명을 변경하지만 컴파일 및 작동합니다.

더 좋은 방법을 알고 있습니까?

+0

. 참고로 [Stack Overflow : TypeScript로 가져오고 설정하기] (http://stackoverflow.com/questions/12827266/get-and-set-in-typescript)를 참조하십시오. 그러나 일반적인 설정 개념을 고집한다면 언어 키워드' 인터페이스 '와'구현', 예. in [Stack Overflow : "클래스 선언"과 "인터페이스"의 차이점은 무엇입니까?] (http://stackoverflow.com/questions/14345485/whats-the-difference-between-declare-class-and-interface-in -typeescript) – xmojmr

+0

일반 함수가 반 패턴이되었을 때부터? Classe는 너무 서투르므로 원하지 않는 오버 헤드가있는 객체로 인스턴스화해야합니다. –

+0

반 패턴인지 여부에 대해서는 논쟁하지 않겠지 만, 어떻게 작동시킬 객체를 만들지 않고 * 정확히 당신의 방법을 사용하겠습니까? –

답변

0

나는 조금 주위를 연주하고, 나는 단지이 함께 올 수 :

// === unsave approach === 

/** 
* Test class 
*/ 
class MyClassWithoutKey { 
    public youCanCallThis() { } 
} 

/** 
* The setter function 
*/ 
function withKeyUnsafe<T>(value: T, key: any) { 
    (<any>value).key = key; 
    return value; 
} 

// compile test 
var w = withKeyUnsafe(new MyClassWithoutKey(), 2).youCanCallThis(); 

을이 :

귀하의 보편적 인 setter 함수는 다른 언어에서 수입 안티 패턴처럼 보이는
// === typesave approach === 

/** 
* Test class 
*/  
class MyClassWithKey { 
    key: string; 
    public youCanCallThis() { } 
} 

/** 
* Helper interface 
*/ 
interface WithKey<T> { 
    key: T; 
} 

/** 
* Factory function that adds type constraint 
*/ 
function withKeyTypeSave<T>() { 
    /** 
    * The actual setter function 
    */ 
    return function <WithKeyT extends WithKey<T>>(value: WithKeyT, key: T) { 
     value.key = key; 
     return value; 
    } 
} 


// compile test -- works 
withKeyTypeSave<string>()(new MyClassWithKey(), "new key").youCanCallThis(); 

// compile test -- fails 
withKeyTypeSave<number>()(new MyClassWithKey(), "new key").youCanCallThis(); 

// compile test -- fails 
withKeyTypeSave<string>()(new MyClassWithKey(), 3).youCanCallThis(); 
관련 문제