Typescript - Как использовать полные типы из общего определения? - PullRequest
0 голосов
/ 10 мая 2018

Вот моя наивная попытка использовать универсальный тип из объекта параметра типа MyObject<P> в функцию обратного вызова.

interface PropsType {
  value: number;
}

class MyObject<P extends PropsType> {
  readonly props: P;

  constructor(props: P) {
    this.props = props;
  }
}

function doSomething<P extends PropsType, T extends MyObject<P>>(
  object: T,
  callback: (props: P) => number
): number {
  return callback(object.props);
}

const myProps = {
  value: 21,
  otherValue: 42
}
const myObject = new MyObject(myProps);

// In the callback, props is of type PropsType
doSomething(myObject, (props) => props.otherValue);
// [ts] Property 'otherValue' does not exist on type 'PropsType'.

Тип myObject, как и ожидалось, MyObject<{ value: number, otherValue: number }>, поэтому я ожидал, что универсальный тип будет распространен до doSomething. P будет { value: number, otherValue: number }, а затем props будет того же типа.

Однако ошибка ясно показывает, что props имеет тип PropTypes, который является наименьшим возможным типом для P.

Есть ли способ сказать компилятору Typescript передать полное определение P в обратный вызов, кроме принудительного принудительного вызова типов, как это?

doSomething<
  (typeof myObject)['props'],
  typeof myObject
>(myObject, (props) => props.otherValue);

1 Ответ

0 голосов
/ 10 мая 2018

Получение машинописного текста для вывода одного параметра типа на основе другого обычно не работает. В этом случае вы можете использовать запрос типа:

function doSomething<T extends MyObject<PropsType>>(
    object: T,
    callback: (props: T['props']) => number
 ): number {
    return callback(object.props);
}

doSomething(myObject, (props) => props.otherValue); //works
...