TypeScript의 클래스에 오리 타이핑이 허용되는 이유
TypeScript에서 (컴파일러 관점에서) 이러한 코드를 갖는 것은 절대적으로 문제가 없는 것처럼 보입니다.
class Vehicle {
public run(): void { console.log('Vehicle.run'); }
}
class Task {
public run(): void { console.log('Task.run'); }
}
function runTask(t: Task) {
t.run();
}
runTask(new Task());
runTask(new Vehicle());
하지만 동시에 나는 컴파일 오류를 예상할 것이다, 왜냐하면Vehicle
그리고.Task
공통점이 없습니다.
또한 명확한 인터페이스 정의를 통해 정상적인 사용을 구현할 수 있습니다.
interface Runnable {
run(): void;
}
class Vehicle implements Runnable {
public run(): void { console.log('Vehicle.run'); }
}
class Task implements Runnable {
public run(): void { console.log('Task.run'); }
}
function runRunnable(r: Runnable) {
r.run();
}
runRunnable(new Task());
runRunnable(new Vehicle());
또는 공통 상위 개체:
class Entity {
abstract run(): void;
}
class Vehicle extends Entity {
public run(): void { console.log('Vehicle.run'); }
}
class Task extends Entity {
public run(): void { console.log('Task.run'); }
}
function runEntity(e: Entity) {
e.run();
}
runEntity(new Task());
runEntity(new Vehicle());
그리고 자바스크립트의 경우 클래스도 없고 컴파일러도 전혀 없고(통사적인 설탕만) 언어에 오리 타이핑이 자연스럽기 때문에 그런 행동을 하는 것은 절대적으로 괜찮습니다.그러나 TypeScript는 정적 검사, 클래스, 인터페이스 등을 도입하려고 합니다.하지만 수업 사례에 대한 오리 타이핑은 다소 혼란스럽고 오류가 발생하기 쉬운 것으로 보입니다.
이것이 구조 타이핑이 작동하는 방식입니다.Typescript에는 JavaScript 작동 방식을 가장 잘 에뮬레이트할 수 있는 구조적 유형 시스템이 있습니다.Javascript는 Duck Typing을 사용하기 때문에 계약을 정의하는 객체는 어떤 기능이든 사용할 수 있습니다.Typescript는 런타임이 아닌 컴파일 시간에 오리 타이핑의 유효성을 검사하려고 합니다.
그러나 개인 정보를 추가하는 즉시 클래스가 동일한 구조를 갖더라도 호환되지 않는 문제가 발생합니다.
class Vehicle {
private x: string;
public run(): void { console.log('Vehicle.run'); }
}
class Task {
private x: string;
public run(): void { console.log('Task.run'); }
}
function runTask(t: Task) {
t.run();
}
runTask(new Task());
runTask(new Vehicle()); // Will be a compile time error
이 동작을 사용하면 인터페이스를 명시적으로 구현하지 않을 수 있습니다. 예를 들어 함수는 매개 변수의 인터페이스를 인라인으로 정의할 수 있으며 계약을 충족하는 클래스는 다음과 같이 명시적으로 구현하지 않더라도 호환됩니다.
function runTask(t: { run(): void }) {
t.run();
}
runTask(new Task());
runTask(new Vehicle());
개인적으로 C#에서 제공되는 것은 처음에는 미친 것처럼 보였지만, 확장성과 관련하여 이러한 유형 검사 방식을 사용하면 훨씬 더 큰 유연성을 허용하고 익숙해지면 이점을 볼 수 있습니다.
이제 컨텍스트별로 유형을 구분할 수 있는 TypeScript로 공칭 유형을 만들 수 있습니다.다음 질문을 고려해 주십시오.
TypeScript에서 원자 유형 식별(공칭 원자 유형)
예를 들어,
export type Kilos<T> = T & { readonly discriminator: unique symbol };
export type Pounds<T> = T & { readonly discriminator: unique symbol };
export interface MetricWeight {
value: Kilos<number>
}
export interface ImperialWeight {
value: Pounds<number>
}
const wm: MetricWeight = { value: 0 as Kilos<number> }
const wi: ImperialWeight = { value: 0 as Pounds<number> }
wm.value = wi.value; // Gives compiler error
wi.value = wi.value * 2; // Gives compiler error
wm.value = wi.value * 2; // Gives compiler error
const we: MetricWeight = { value: 0 } // Gives compiler error
언급URL : https://stackoverflow.com/questions/48829743/why-duck-typing-is-allowed-for-classes-in-typescript
'code' 카테고리의 다른 글
jQuery로 머리글과 바닥글 사이를 스크롤할 때 사이드바를 고정시키는 방법은 무엇입니까? (0) | 2023.07.02 |
---|---|
Angular - *ngIf 대 템플릿의 단순 함수 호출 (0) | 2023.07.02 |
숨겨진 셀 찾기 수행 (0) | 2023.07.02 |
gitsvn을 사용하여 원격 지점 체크아웃 (0) | 2023.07.02 |
SpringBoot의 요청 매핑이 작동하지 않음 (0) | 2023.07.02 |