2014-03-26 2 views
8

TypeScript는 컴파일 타임 (정적) duck typing을 사용합니다.TypeScript Duck Typing, 강력한 정적 타이핑을 원합니다

저는 잘못된 대체를 방지하기 위해 기본 유형을 확장하는 팬입니다. 예를 들어, 저는 신용 카드 번호 변수에 정수가 아닌 신용 카드 번호 유형을 제공하고자합니다. 최근 String을 확장하는 한 쌍의 인터페이스를 사용하여 TypeScript에서이 작업을 시도해 보았습니다. 그리고 서로 자유롭게 대체 할 수 있다는 것을 알았습니다.

정말 컴파일 타임에 공칭 타이핑을하고 싶습니다. 어떤 아이디어?

+1

명목 타이핑을 의미합니까? TypeScript의 유형 시스템은 정적이며 JavaScript의 런타임 의미론은 근본적으로 약하며 강력한 유형 시스템과 충돌합니다. –

+0

네, 공칭 타이핑은 제가 필요한 용어입니다. 위의 강력한 타이핑에 대한 수정 된 참조입니다. 감사! – Eric

+0

가능한 복제 [기본 형식을 확장하는 TypeScript에서 공칭 형식을 만드는 방법이 있습니까?] (http://stackoverflow.com/questions/26810574/is-there-a-way-to-create-nominal-types- –

답변

3

나는 더 강한 타이핑을 얻는 한 가지 방법을 생각해 냈습니다. 나는 그것을별로 좋아하지 않는다. 하나는 특별한 유형의 필드 또는 메소드를 각 유형에 추가하여 다른 유형과 호환되지 않으므로 오리로 혼동 될 수 있습니다.

다음은 Duck 클래스에 추가 메서드가 있으므로 (Parrot은 오리 입력에 실패하기 때문에) Duck 용 Parrot을 대체 할 수 없습니다. 참새와 앵무새는 앵무새가 할 수있는 것이 없기 때문에 오리 타이핑에서 분명히 대체 할 수 있습니다. 반대의 경우도 마찬가지입니다. 물론 오리는 앵무새와 같을 수 있기 때문에 앵무새를 대신 할 수 있습니다.

www.typescriptlang.org/Playground/와 시험 :

실질적으로
class Sparrow { 
    sound = "cheep"; 
} 
class Parrot { 
    sound = "squawk"; 
} 
class Duck { 
    sound = "quack"; 
    swim(){ 
     alert("Going for a dip!"); 
    } 
} 
var parrot: Parrot = new Sparrow(); // substitutes 
var sparrow: Sparrow = new Parrot(); // substitutes 
var parrotTwo: Parrot = new Duck(); 
var duck: Duck = new Parrot(); // IDE & compiler error 

alert("Parrot says "+parrot.sound+" and sparrow says "+sparrow.sound+", and 2nd parrot says "+parrotTwo.sound); 
alert("A duck says "+duck.sound); 

더, 내가 (하지만 놀이터에서 내 IDE에서 작동하는) 이런 짓을 했을까 :

interface RawUri extends String { 
    rawUri; 
} 

interface EncodedUri extends String { 
    encodedUri; 
} 

var e: EncodedUri = new RawUri(); // IDE & compiler error 
var r: RawUri = new EncodedUri(); // IDE & compiler error 

불쾌감, 다른 인터페이스를위한 기회 실수로 같은 필드 이름을 사용합니다. 안티 오리 멤버에게 임의의 요소를 추가 할 수 있다고 가정합니다.

관련 문제