#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";