Интерфейс Typescript ожидает, что один номер реквизита будет меньше, чем другой номер реквизита - PullRequest
0 голосов
/ 23 октября 2018

Можно ли заставить интерфейс TypeScript принимать number проп, значение которого всегда должно быть меньше, чем у другого number проп в интерфейсе?

Например, если у меня было numberOfFiles prop и currentFileIndex prop, и я всегда ожидаю, что currentFileIndex prop будет меньше numberOfFiles.Могу ли я определить это в моем интерфейсе.

Что-то вроде этого:

interface IProps {
  numberOfFiles: number;
  currentFileIndex: number<less than numberOfFiles>;
}

Это не конец света, если это невозможно, но было бы здорово узнать, илине это.

1 Ответ

0 голосов
/ 23 октября 2018

Нет никакого способа сделать это напрямую, у typScript нет способа смоделировать такое ограничение.

Однако вы можете заставить всех пользователей этого интерфейса выполнить проверку на ранней стадии, используя фирменные типы, аналогично тому, что здесь представлено

interface IProps {
    numberOfFiles: number;
    currentFileIndex: number & { mustBeLessThenNumberOfFiles: true };
}

type Omit<T, TKeys extends keyof T> = Pick<T, Exclude<keyof T, TKeys>>
function createProps(p: Omit<IProps, 'currentFileIndex'> & {
    currentFileIndex: number 
}) {
    if(p.currentFileIndex > p.numberOfFiles) throw "Error!";
    return p as IProps;
}

//ok
createProps({
    numberOfFiles: 10,
    currentFileIndex: 5
});

// compiles but with runtime error when props are created
createProps({
    numberOfFiles: 10,
    currentFileIndex: 15
});

// error
let p : IProps = {
    numberOfFiles: 10,
    currentFileIndex: 5 // error we did not make sure with a check 
}
...