programing

TypeScript에서 빈 개체 유형 정의

elecom 2023. 6. 7. 22:10
반응형

TypeScript에서 빈 개체 유형 정의

값을 포함할 수 없는 빈 개체 유형을 정의하는 방법을 찾고 있습니다.

type EmptyObject = {}

const MyObject: EmptyObject = {
  thisShouldNotWork: {},
};

유형이 지정된 개체는 속성을 추가할 수 있습니다.어떻게 해야 합니까?MyObject대신에 항상 빈 물체가 되는 것?

실제 사용 사례는 인터페이스 내부의 EmptyObject 유형을 사용하는 것입니다.

interface SchemaWithEmptyObject {
  emptyObj: EmptyObject; 
}
type EmptyObject = {
    [K in any] : never
}

const one: EmptyObject = {}; // yes ok
const two: EmptyObject = {a: 1}; // error

우리가 여기서 말하는 것은 우리의 모든 궁극적인 특성이EmptyObject뿐일 수 있습니다never그리고 로서never표현 값이 없으므로 이러한 속성을 만들 수 없으므로 개체는 빈 상태로 유지됩니다. 이 방법이 컴파일 오류 없이 개체를 만들 수 있는 유일한 방법이기 때문입니다.

type EmptyObject = Record<any, never>

이것은 Maciej Sikora의 답변과 동일하지만 Record 유틸리티 유형을 사용합니다.

VSC linter에 따름type emtyObj = Record<string, never>.

빈 개체 유형을 정의하는 몇 가지 옵션이 있으며 속성에 액세스하거나 설정할 때 린터 및 유형 스크립트 오류와 관련하여 원하는 부작용에 따라 완전히 달라집니다.제가 시도한 옵션은 다음과 같습니다.

// Option A:
let objA: Record<any, never> = {}; // Typescript-ESLint error: Unexpected any. Specify a different type.
objA = { prop: 'value' }; // Typescript error: Type 'string' is not assignable to type 'never'.
console.log(objA.prop);
console.log(objA.nonExistingProp); // No error!!!

// Option B:
let objB: Record<string, never> = {};
objB = { prop: 'value' }; // Typescript error: Type 'string' is not assignable to type 'never'.
console.log(objB.prop);
console.log(objB.nonExistingProp); // No error!!!

// Option C:
let objC: Record<never, never> = {};
objC = { prop: 'value' };
console.log(objC.prop); // Typescript error: Property 'prop' does not exist on type 'Record<never, never>'
console.log(objC.nonExistingProp); // Typescript error: Property 'nonExistingProp' does not exist on type 'Record<never, never>'.

TLDR: 빈 개체에 속성을 설정할 때 오류가 발생합니다. Record<never, never> 빈 개체의 속성에 액세스할 때 오류가 발생합니다.두 경우 모두 오류를 일으킬 수 있는 해결책을 아직 찾지 못했습니다.

개인적으로 저는 빈 개체의 속성에 액세스하려고 하면 오류가 발생하기를 원했기 때문에 현재 사용 사례에 대한 옵션 C를 선택했습니다. 하지만 당신은 원하지 않을 수도 있습니다!

개인 기호가 있는 이런 것은 어떻습니까?

// EmptyType.ts
const EMPTY_SYMBOL = Symbol();
export type EmptyType = {[EMPTY_SYMBOL]?: never};

교차로 결합 유형에 대해 올바르게 작동합니다.

import {EmptyType} from "./EmptyType";
type Union = EmptyType | { id: string };
const a: Union = {};
const b: string = a.id; // <-- error

TypeScript Playground

언급URL : https://stackoverflow.com/questions/60111963/define-an-empty-object-type-in-typescript

반응형