가짜 정적 클래스를 사용하여 네임스페이스(js/ts) 보호
그리고 우리는 이것을 하는 OOP 이후의 사람들입니다.
type Point = [x: number, y: number]
function magnitude(p: Point) {
return Math.sqrt(p[0] * p[0] + p[1] * p[1])
}
이렇게 하는 대신
class Point {
constructor(public x: number, public y: number) {}
magnitude() {
return Math.sqrt(this.x * this.x + this.y * this.y)
}
}
유형 및 인터페이스 및 함수 접근 방식은 이상한 상속 패턴을 방지하고 데이터베이스/파일 시스템/네트워킹 목적을 위해 잘 직렬화하며 일반적으로 이러한 클래스를 분해하고 항상 다시 인스턴스화할 필요가 없기 때문에 더 간결한 코드를 작성할 수 있습니다.
// nice
function add(p: Point, q: Point): Point {
return [p[0] + q[0], p[1] + q[1]]
}
// annoying constructor; less symetric
class Point {
// ...
add(q) {
return new Point(this.x + q.x, this.y + q.y)
}
}
하지만 이 전환 과정에서 잃어버린 것이 있습니다. 프로젝트 네임스페이스가 방대해집니다. 대규모 프로젝트에는 다양한 유형의 데이터로 수행하려는 몇 가지 일반적인 작업이 있습니다. ECMAScript 모듈을 사용하면 짧고 적절한 이름을 사용할 수 있습니다. 프로젝트는 다음과 같이 표시됩니다.
// accounts.ts
function transfer(accountId: string, amount: number) {}
// item-management.ts
function transfer(from: User, to: User, itemId: string) {}
// array-helpers.ts
function transfer<T>(from: T[], to: T[], val: T) {}
// ...
한 달 후 누군가 계정 잔액을 이체하기 위한 새 페이지를 만들고 싶어합니다.
transfer
로 점프를 시도하고 5개의 내보낸 정의가 있습니다. 해결책
하나의 파일에서 하나의 유형과 모든 메서드를 정의하고 개체의 메서드를 캡슐화합니다.
// Point.ts
export type Point = [x: number, y: number]
export const Point = {
mag: (p: Point) => Math.sqrt(p[0] * p[0] + p[1] * p[1]),
add: (p: Point, q: Point) => [p[0] + q[0], p[1] + q[1]],
mul: (p: Point, factor: number) => [p[0] * factor, p[1] * factor],
} as const
// some-application-code.ts
import { Point } from './Point'
function whatever() {
const p: Point = [5, 6]
const q: Point = [10, 11]
return Point.add(p, q)
}
이것은
Point.add
는 고유하지만 add
는 잘못된 긍정이 많습니다), Reference
이 문제에 관하여(가짜 정적 클래스를 사용하여 네임스페이스(js/ts) 보호), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/qpwo/use-fake-static-classes-to-protect-your-namespace-jsts-2pfd텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)