проверить, есть ли у интерфейса свойство? - PullRequest
0 голосов
/ 04 августа 2020

Необходимо проверить, имеет ли интерфейс свойство специфицированного c. Пробовал / гуглил, но не нашел подходящего решения. Например:

interface Props {
  id: string;
  name: string;
  age: number;
}

Как лучше всего проверить, есть ли у Props свойство age?

Ответы [ 2 ]

0 голосов
/ 05 августа 2020

В комментарии вы сказали:

Мне нужно для условной проверки. Например, if (interface contain property) делает определенную вещь

Вы не можете этого сделать. При выполнении операторов if интерфейсы не существуют во время выполнения. Вся информация о типе TypeScript стирается при компиляции из TypeScript в JavaScript (есть некоторые объекты, созданные enum, но информация о типе, связанная с ними, отсутствует).

Вы можете проверить, есть ли объект имеет особое свойство во время выполнения:

// Check if it has a property (either as an own property or an inherited one)
if ("propertyName" in someObject) {
    // ...yes, it does...
}

или

// Check if it has a property (as an own property, ignoring inherited ones)
if (someObject.hasOwnProperty("propertyName")) {
    // ...yes, it does...
}

Некоторые люди считают, что вам не следует использовать hasOwnProperty в качестве такого метода, потому что он может быть переопределено, и вместо этого вы должны использовать его на Object.prototype:

// Check if it has a property (as an own property, ignoring inherited ones)
if (Object.prototype.hasOwnProperty.call(someObject, "propertyName")) {
    // ...yes, it does...
}
0 голосов
/ 04 августа 2020

Если то, что вы ищете, проверяет, существует ли ключ во время компиляции в типе, вы можете использовать что-то вроде этого:

type ContainsKey<T, K extends string | number> = T extends { [key in K]: any }
  ? true
  : false

type contains1 = ContainsKey<Props, 'age'> // type contains1 = true
type contains2 = ContainsKey<Props, 'foo'> // type contains2 = false
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...