Вот моя наивная попытка использовать универсальный тип из объекта параметра типа 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);