나는 더 강한 타이핑을 얻는 한 가지 방법을 생각해 냈습니다. 나는 그것을별로 좋아하지 않는다. 하나는 특별한 유형의 필드 또는 메소드를 각 유형에 추가하여 다른 유형과 호환되지 않으므로 오리로 혼동 될 수 있습니다.
다음은 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
불쾌감, 다른 인터페이스를위한 기회 실수로 같은 필드 이름을 사용합니다. 안티 오리 멤버에게 임의의 요소를 추가 할 수 있다고 가정합니다.
명목 타이핑을 의미합니까? TypeScript의 유형 시스템은 정적이며 JavaScript의 런타임 의미론은 근본적으로 약하며 강력한 유형 시스템과 충돌합니다. –
네, 공칭 타이핑은 제가 필요한 용어입니다. 위의 강력한 타이핑에 대한 수정 된 참조입니다. 감사! – Eric
가능한 복제 [기본 형식을 확장하는 TypeScript에서 공칭 형식을 만드는 방법이 있습니까?] (http://stackoverflow.com/questions/26810574/is-there-a-way-to-create-nominal-types- –