function addTlChild(childParams, tl, parsedTLPosition, targets, index, length) {
  // Offset the tl position with -minValue for 0 duration animations or .set() calls in order to align their end value with the defined position
  const TLPosition = isNum(childParams.duration) && /** @type {Number} */(childParams.duration) <= minValue ? parsedTLPosition - minValue : parsedTLPosition;
  tick(tl, TLPosition, 1, 1, tickModes.AUTO);
  const tlChild = targets ?
    new Animation(targets,/** @type {AnimationParams} */(childParams), tl, TLPosition, false, index, length) :
    new Timer(/** @type {TimerParams} */(childParams), tl, TLPosition);
  tlChild.init(1);
  // TODO: Might be better to insert at a position relative to startTime?
  addChild(tl, tlChild);
  forEachChildren(tl, (/** @type {Renderable} */child) => {
    const childTLOffset = child._offset + child._delay;
    const childDur = childTLOffset + child.duration;
    if (childDur > tl._iterationDuration) {
      tl._iterationDuration = childDur;
    }
  });
  tl.duration = clampInfinity(((tl._iterationDuration + tl._loopDelay) * tl._iterationCount) - tl._loopDelay) || minValue;
  return tl;
}
@overload
@param  {TimerParams} childParams
@param  {Timeline} tl
@param  {Number} parsedTLPosition
@return {Timeline}

@overload
@param  {AnimationParams} childParams
@param  {Timeline} tl
@param  {Number} parsedTLPosition
@param  {TargetsParam} targets
@param  {Number} [index]
@param  {Number} [length]
@return {Timeline}

@param  {TimerParams|AnimationParams} childParams
@param  {Timeline} tl
@param  {Number} parsedTLPosition
@param  {TargetsParam} [targets]
@param  {Number} [index]
@param  {Number} [length]