Typescript проверяет, существует ли строка в качестве ключа интерфейса

#typescript #interface

#typescript #интерфейс

Вопрос:

Могу ли я проверить, существует ли строка в качестве ключа интерфейса

 interface list {
    one: string
    two: string
}

const myNumber = "one"
  

Как мне проверить, является ли значение myNumber ключом интерфейса

Комментарии:

1. Чего вы пытаетесь достичь? Что вы хотите, чтобы произошло, если значение находится в интерфейсе или его нет в интерфейсе? Вы хотите вызвать ошибку времени компиляции, когда ее нет в интерфейсе, или что-то в этом роде?

2. У меня есть объектный литерал с ключами в дополнение к ключам интерфейса «список», и я хотел бы отфильтровать этот объект с помощью этих ключей только в интерфейсе «список»

Ответ №1:

Для этого вам нужно иметь что-то, что позволяет вам получать ключ интерфейса во время выполнения. An interface не существует во время выполнения — это чисто конструкция TypeScript, поэтому она не существует в исходящем коде.

Создайте массив, содержащий ключи, объявите его as const , чтобы он не расширялся автоматически по типу, и тогда вы сможете превратить его в List тип. Тогда у вас будет как тип, так и массив времени выполнения, для которого вы можете использовать .includes проверку:

 const listKeys = ['one', 'two'] as const;
type List = Record<typeof listKeys[number], string>;

// ...

const obj = {
    one: 'one',
    two: 'two',
    three: 'three'
};
// Transformation to string[] needed because of an odd design decision:
// https://github.com/Microsoft/TypeScript/issues/26255
const newObj = Object.fromEntries(
    Object.entries(obj).filter(
        ([key]) => (listKeys as unknown as string[]).includes(key)
    )
);
  

Ссылка на игровую площадку

Ответ №2:

Тип Typescript не является значением.

Поэтому работа Javascript невозможна.

Однако в примере тип можно задать так, чтобы myNumber был типом, соответствующим ключу.

 interface list {
    one: string
    two: string
}

const myNumber: keyof list = "one"; // myNumber allow only "one" or "two";