The fields are described at http://genome.ucsc.edu/FAQ/FAQformat#format1 Fields 4-12 are optional
function parseBedFeature(f): Gene {
  var position = new ContigInterval(f.contig, f.start, f.stop),
      x = f.rest.split('\t');

  // if no id, generate randomly for unique storage
  var id = x[0] ? x[0] : position.toString(); // e.g. ENST00000359597
  var score = x[1] ? parseInt(x[1]) : 1000; // number from 0-1000
  var strand =  strToStrand(x[2]); // either +, - or .
  var codingRegion = (x[3] && x[4]) ? new Interval(Number(x[3]), Number(x[4])) :new Interval(f.start, f.stop);
  var geneId =  x[9] ? x[9] : id;
  var name =  x[10] ? x[10] : "";

  // parse exons
  var exons = [];
  if (x[7] && x[8]) {
    // exons arrays sometimes have trailing commas
    var exonLengths = x[7].replace(/,*$/, '').split(',').map(Number),
      exonStarts = x[8].replace(/,*$/, '').split(',').map(Number);

    exons = _.zip(exonStarts, exonLengths)
             .map(function([start, length]) {
               return new Interval(f.start + start, f.start + start + length);
             });
  }

  return new Gene({
    position,
    id: id,
    score: score,
    strand: strand,
    codingRegion: codingRegion,
    geneId: geneId,
    name: name,
    exons
  });
}