打字稿 - 如何使用通用定义中的完整类型?

时间:2018-05-10 09:32:20

标签: typescript typescript-generics

这是我尝试将类型为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 }>,所以我期望泛型类型会传播到doSomethingP将为{ value: number, otherValue: number },然后props也属于该类型。

但是,错误清楚地表明props属于PropTypes类型,这是P的最小可能类型。

有没有办法告诉Typescript编译器将完整的P定义传递给回调,除了像这样明确强制类型?

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

1 个答案:

答案 0 :(得分:0)

使用typescript来推断一个基于另一个的类型参数通常不起作用。在这种情况下,您可以使用类型查询:

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

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