[typescript] TypeScript 인터페이스에서 특정 문자열을 요구하는 방법

타사 js 라이브러리에 대한 TypeScript 정의 파일을 작성 중입니다. 방법 중 하나는 옵션 개체를 허용하고 옵션 개체의 속성 중 하나가 목록에서 문자열을 받아 : "collapse", "expand", "end-expand",와 "none".

옵션 객체에 대한 인터페이스가 있습니다.

interface IOptions {
  indent_size?: number;
  indent_char?: string;
  brace_style?: // "collapse" | "expand" | "end-expand" | "none"
}

인터페이스가이를 강제 할 수 있으므로 속성을 IOptions가진 개체 를 포함 brace_style하면 허용 가능한 목록에있는 문자열 만 허용합니까?



답변

이것은 버전 1.8에서 “문자열 리터럴 유형”으로 릴리스되었습니다.

Typescript의 새로운 기능-문자열 리터럴 유형

페이지의 예 :

interface AnimationOptions {
  deltaX: number;
  deltaY: number;
  easing: "ease-in" | "ease-out" | "ease-in-out";
}


답변

이 시도

export type ReadingTypes = 'some'|'variants'|'of'|'strings';

export interface IReadings {
   param:ReadingTypes
}


답변

아마도 정확히 원하는 것이 아니지만 Enums는 완벽한 솔루션처럼 보입니다.

enum BraceStyle {Collapse, Expand, EndExpand, None}

interface IOptions {
  indent_size?: number;
  indent_char?: string;
  brace_style?: BraceStyle
}

그러나 열거 형은 숫자를 기반으로합니다. 예를 들어 런타임 동안 실제 값은 BraceStyle.Collapse0이됩니다. 그러나 객체로 컴파일되기 때문에 다른 비 유형 스크립트 스크립트와 함께 사용할 수 있습니다. 다음은 BraceStyle컴파일 및 실행 방법 입니다.

{
    0: "Collapse",
    1: "Expand",
    2: "EndExpand",
    3: "None",
    Collapse: 0,
    Expand: 1,
    EndExpand: 2,
    None: 3
}

대신 문자열을 원하면 여기에 설명 된 것처럼 정적 멤버가있는 클래스를 사용할 수 있습니다


답변

TS는 문자열 리터럴 유형 이라고하는 특정 문자열 값에 대한 타이핑을 제공합니다 .

사용 방법의 예는 다음과 같습니다.

type style =  "collapse" | "expand" | "end-expand" | "none";

interface IOptions {
  indent_size?: number;
  indent_char?: string;
  brace_style1?:  "collapse" | "expand" | "end-expand" | "none";
  brace_style2?:  style;
}

// Ok
let obj1: IOptions = {brace_style1: 'collapse'};

// Compile time error:
// Type '"collapsessss"' is not assignable to type '"collapse" | "expand" | "end-expand" | "none" | undefined'.
let obj2: IOptions = {brace_style1: 'collapsessss'};


답변

function keysOf<T>(obj: T, key: keyof T) { return obj[key]; }
interface SomeInterface {
   a: string;
}
const instance: SomeInterface = { a: 'some value'};
let value = keysOf<SomeInterface>(instance, 'b'); // invalid
value =  keysOf<SomeInterface>(instance, 'a'); // valid


답변

TypeScript 2.4부터는 문자열 열거 형을 사용할 수 있습니다

이 방법은 동일한 하드 코딩 된 문자열을 둘 이상의 위치에 둘 필요가 없기 때문에이 방법을 선호합니다.

값이 문자열 인 열거 형을 만들 수 있습니다

export enum VISIBILITY {
  PUBLISH = "publish",
  DRAFT = "draft"
}

이 열거 형은 인터페이스 또는 클래스에서 유형으로 사용될 수 있습니다.

export interface UserOptions  {
  visibility:  VISIBILITY
}


답변