Как требовать определенную строку в интерфейсе TypeScript


Я создаю файл машинописного текста определения на 3-й партии библиотеки на JS. Один из методов допускает объект options, а одно из свойств объекта options принимает строку из списка:"collapse","expand","end-expand" и "none".

у меня есть интерфейс для объекта options:

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

может ли интерфейс применить это, так что если вы включаете IOptions объект brace_style свойство, это позволит только строку, которая находится в приемлемом список?

4 53

4 ответа:

Это было выпущено в версии 1.8 как "типы строковых литералов"

что нового в Typescript-String Literal Types

пример со страницы:

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.Collapse будет 0 в этом случае. Но вы можете использовать их с другими, даже не типизированными сценариями, поскольку они компилируются в объекты. Вот как BraceStyle будет выглядеть после компиляции и запуска:

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

если вы хотите вместо строк, вы можете использовать класс со статическими членами, как описано здесь

еще одна возможность сделать что-то вроде:

/**  Your comments here that you want to show up  
*    highlight instances of this in your code
*/
export interface YourString {
  [index: number]: string;
}