2017-11-03 8 views
1

첫 번째 매개 변수에 가능한 값의 열거 형을 가지고 있으며 첫 번째 매개 변수를 기반으로 두 번째 매개 변수를 원합니다. 따라서 NAME이 주어지면 두 번째 매개 변수를 문자열로 지정합니다. 나이가 주어지면 두 번째 매개 변수를 숫자로 지정합니다.TypeScript 첫 번째 매개 변수 유형에 기초한 두 번째 매개 변수 유형

어떻게하면됩니까?

enum KeyType { 
    NAME, 
    AGE 
} 

class MyClass { 
    public static setProperty(key: KeyType.NAME, value: string): void { } 
    public static setProperty(key: KeyType.AGE, value: number): void { } 
} 

그리고이 같은 메서드를 호출 할 것이다 : 또한
MyClass.setProperty(KeyType.NAME, 'John');

, 이것은 오류 표시해야합니다 :
MyClass.setProperty(KeyType.NAME, 5); // (5)이 예에서는 문자열

아니다 key 유형이 잘못 정의되어 있으므로 작동하지 않습니다 (키 유형은 실제로 열거 형 값이므로 키 유형은 0입니다).

특정 매개 변수 키에만 특정 유형을 허용하는이 기능을 사용하는 다른 접근 방법에 대한 제안도 있습니다. 어떤이 방법에 대한

var enum1 = { SMALL:"asjdh", MEDIUM:2}; 
console.log(enum1.SMALL) 
console.log(enum1.MEDIUM) 
+0

당신이'MyClass'에 넣었던 것에서 타입을 수정 하시겠습니까? 하나 이상의 유형을 가질 수있는 것은 어떻습니까? 당신은 단순히'name : string; '과'age : number;'속성을 사용하지 않는 특별한 이유가 있습니까? – jonrsharpe

+0

@jonrsharpe 내가 오버로드 된 메서드가되고 싶습니다. 따라서 두 번째 매개 변수의 형식은 첫 번째 매개 변수의 KeyType 값을 기반으로합니다. 그래서, 당신은'MyClass.name = string'과 같은 것을 제안합니다,하지만 MyClass.set ('name', string)'과 같은 것을 원합니다. 이 방법은 이름이 변수 내에 저장 될 때 속성 값을 동적으로 설정할 수 있습니다. 또한이 방법으로 변경할 수있는 모든 사용 가능한 속성의 'enum'을 갖게됩니다. – Cristy

+1

당신은'keyof'와 함께 enum을 필요로하지 않습니다. 그리고'thing [name]'으로 동적으로 할당 할 수 있습니다.그러나 이것은 https://stackoverflow.com/questions/46909089/dynamic-return-type-based-on-string과 비슷하다고 생각합니다. – jonrsharpe

답변

1

는 유형 검사가 제대로 작동 얻을 오버로드 리터럴 문자열을 입력하면 비슷한 것들을 유형 정의로 그룹화 할 수 있습니다.

type StringProperty = 'name' | 'address'; 
type NumberProperty = 'age' | 'salary'; 
class MyClass { 
    public static setProperty(key: StringProperty, value: string): void; 
    public static setProperty(key: NumberProperty, value: number): void; 
    public static setProperty(key: string, value: (string | number)): void {} 
} 
+0

멋진데 첫 번째 버전이 실제로 작동합니까? 그래서 나는 다른 모든 기능을 포함하는 또 다른 (광석 일반) 기능을 추가해야합니다? 나는 일반적으로 문자열을 사용하는 것을 좋아하지 않는다. 문자열을 사용하기가 어렵고 리팩터링하기가 더 어렵 기 때문이다. – Cristy

+0

고마워, 그게 효과가 있었는데, 같은 유형의 그룹화 속성의 최신 팁과 결합 된 첫 번째 버전 (열거 형)을 사용했습니다. – Cristy

0

당신이 좋아,이

MyClass.setProperty(key: KeyType, value: string |number) { 
    // check key type and throw error as appropriate 
} 
+0

이것은 좋은 아이디어인데, 유일한 문제입니다. 이것은 컴파일 타임이 아니라 런타임에 타입을 검사 할 것입니다. 따라서 필자는 부적합한 매개 변수를 사용하여 함수를 호출하려고하면 TS 오류가 발생하지 않습니다. – Cristy

+0

코드 편집기에 오류가 표시되어야합니다. 키는 반드시 KeyType enum이어야하며 값은 문자열이나 숫자 여야합니다. –

+0

예.하지만 KeyType이 'NAME'이면 값은 숫자가 아닌 문자열이어야합니다. 귀하의 경우 MyClass.setProperty (KeyType.NAME, 5);를 수행하면 편집기에 오류가 표시되지 않지만 이름은 문자열 일 수 있으므로 편집기에서 오류를 표시하지 않습니다. – Cristy

-1

자바 스크립트는 객체를 포함 시도해 볼 수도 있습니다 - 클래스에 age와 name과 같은 두 개의 속성이있는 경우 setProperty 함수는 문자열 또는 연령을 가져올 수 있고 특정 속성에 할당 된 유형을 기반으로 할 수 있습니다 (예 :

class MyClass { 
    public age:number; 
    public name:string; 

    setProperty(value: string|number) { 
     if (typeof value === 'string') { 
      this.name = value; 
     } else if (typeof value === 'number') { 
      this.age = value; 
     } 
    } 
} 

let myClass = new MyClass(); 

myClass.setProperty("John"); 
console.log(myClass.name); 
myClass.setProperty(60); 
console.log(myClass.age); 
).

setProperty(key: string, value: string|number) { 
    if (key === 'AGE') { 
     this.age = value; 
    } else if (key === 'NAME') { 
     this.name = value; 
    } 
} 

하지만이 부분을 보호하기 위해 더 많은 코드를 작성해야이 경우 : 당신이 원하는대로 당신이 그것을 할 수있는 두 가지 유형 (문자열 또는 숫자)와 값이 트릭을 사용 물론

.

class MyClass { 
    public static setProperty(key: 'name', value: string): void; 
    public static setProperty(key: 'age', value: number): void; 
    public static setProperty(key: string, value: (string | number)): void {} 
} 

MyClass.setProperty('name', 42); // Argument of type '"name"' is not assignable to parameter of type '"age"'. 
MyClass.setProperty('age', 42); // Ok 
MyClass.setProperty('name', 'foo'); // Ok 
MyClass.setProperty('age', 'foo'); // Argument of type '"foo"' is not assignable to parameter of type 'number'. 

물론 당신이 나열 할 필요는 없습니다 :

enum KeyType { 
    NAME, 
    AGE 
} 

class MyClass { 
    public static setProperty(key: KeyType.NAME, value: string): void; 
    public static setProperty(key: KeyType.AGE, value: number): void; 
    public static setProperty(key: KeyType, value: (string | number)): void {} 
} 

또는 간단, 그냥 문자열을 사용 : 당신이 기능을 사용하려면

+1

TypeScript에는 enums https://www.typescriptlang.org/docs/handbook/이 있습니다. enums.html – Cristy

-1

을 : 당신이 열거를 사용하려는 경우, 호출 그냥 좋아 정의한 다음 객체 있도록