저는 TypeScript와 인터페이스를 가지고 놀았습니다. 나는 다음 코드를 가지고있다.TypeScript 인터페이스 및 구현
interface Control {
name: string;
onSelect():string;
}
class Button {
name:string="button";
onSelect = function() {
return "hello";
}
}
var a:Button = new Button();
var b:Control = {"name": "arbitrary", "onSelect":() => { return "ahoy!"; }};
var trigger = function(c:Button) {
console.log(c.name, "says", c.onSelect());
}
trigger(a);
trigger(b);
불평없이 컴파일되어 실행된다. 아무도 내 trigger
함수가 Button
및 b
이 유형을 가져올 것으로 예상 되더라도 b
을 허용하는 이유는 설명 할 수 있습니까? Control
입니다.
Button
이 명시 적으로 Control
을 구현하는 경우에도 Button
이 아닌 Control
이 필요합니다. 모든 의도 된 목적으로 Button
에 추가 구성원이 포함될 수 있습니다.
TypeScript는 구조적으로 동일하기 때문에 구현을 유추합니까? 구현 클래스가 예상되는 인터페이스를 전달할 수 있습니까? (그것은 다른 방법으로 주위 안?)
'Button'에 전용 멤버가있는 경우, 그 멤버 만 (또는 클래스에서 확장 한 클래스) 호환되는 유형으로 간주됩니다. 이것이 원하는 동작 인 경우 '더미'개인 회원 추가를 고려할 수 있습니다. –
알겠습니다. 더미 멤버를 추가 할 생각이었습니다. 당신의 의견으로는, 불필요한 것을 시행하는 엄격한 유형입니까? 그것은 TS의 원리에 어긋나는가? –
나는 거의 생산적이지 않다고 말할 수 있지만 항상 예외가 있습니다. '트리거 '가 실제로 사용하는 멤버가 아닌'버튼'의 양상에 실제로 의존하는 경우 디자인 냄새가 다소 있습니다. –