programing

읽기 전용 맵 유형 사용

telecom 2023. 7. 14. 23:40
반응형

읽기 전용 맵 유형 사용

TypeScript 정의ReadonlyMap<K, V>표준 자바스크립트의 불변 버전인 인터페이스Map<K, V>유형.

우리가 어떻게 사용해야 합니까?ReadonlyMap<K, V>우리 코드로?

그것은 어떤 것으로부터도 파생되지 않았고 생성자를 선언하지 않았습니다.그래서 우리가 해야 한다는 것이 사실입니까?

public publicApiMethod(): ReadonlyMap<K, V> {
    const map: Map<K, V> = new Map(...);
    return map as ReadonlyMap<K, V>;
}

또는 더 나은 방법으로 사용할 수 있습니다.ReadonlyMap<K, V>타이프 캐스팅이 아니라요?

짧은 대답: 당신은 옳은 일을 하고 있습니다.

ReadonlyMap<K, V> 본질적으로 그것이 가지고 있는 방법과 특성들이 그것의 그것들과 일치하기 때문에 초유형입니다.Map<K,V>그래서 a를 돌려줌으로써Map로서ReadonlyMap당신이 하는 일은 가치의 유형을 넓히는 것뿐입니다.형식 어설션을 생략할 수 있습니다.

public publicApiMethod(): ReadonlyMap<K, V> {
    const map: Map<K, V> = new Map(...);
    return map; // no assertion necessary
}

당신이 할 수 있는 것처럼:

public anotherMethod(): string | number {
    return "hey"; // always "hey", but assignable to string | number
}

이점은 호출자가 반환된 값이 다른 값을 가지고 있다고 가정할 수 없다는 것입니다.Map메소드들, 그리고 맵 내용을 설정하거나 지우려고 하는 것은 그러한 메소드들이 실제로 런타임에 존재한다는 사실에도 불구하고 컴파일 시간 오류를 발생시킬 것입니다.anotherMethod()예를 들어, 호출자는 반환 값이 항상 a라는 것을 알 수 없습니다.string문자열 특정 메서드를 직접 호출할 수 없습니다.)

런타임 동작에 대한 이러한 컴파일 시간 금지는 수식어가 작동하는 방식과 유사합니다.속성이 다음과 같은 경우readonlyTypeScript는 수정이 런타임에 성공하더라도 수정을 시도하면 불만을 제기합니다.

원하는 경우 자체 버전의ReadonlyMap이는 런타임에도 읽기 전용이지만, 필요한 사용 사례가 있는 경우에만 노력할 가치가 있습니다.만약 그렇지 않다면 (아마도 그렇지 않을 것입니다) 걱정하지 말고 지금처럼 계속하세요.

컴파일 시 안전을 위해 다음과 같이 사용할 수 있습니다.

public publicApiMethod(): ReadonlyMap<K, V> {
    const map: Map<K, V> = new Map(...);
    ...
    return map; // no need casting
}

런타임에 안전하게 사용할 수 있도록 다음과 같이 사용할 수 있습니다.

public publicApiMethod(): ReadonlyMap<K, V> {
    const map: Map<K, V> = new Map(...);
    ...

    const trueRuntimeReadonlyMap: ReadonlyMap<string, string> = Object.freeze({
        entries: map.entries.bind(map),
        forEach: map.forEach.bind(map),
        get: map.get.bind(map),
        has: map.has.bind(map),
        keys: map.keys.bind(map),
        size: map.size,
        values: map.values.bind(map),
        [Symbol.iterator]: map[Symbol.iterator].bind(map)
    });

    return trueRuntimeReadonlyMap;
}

언급URL : https://stackoverflow.com/questions/50046573/using-readonlymapk-v-type

반응형