```ts
export function selectorHits(values: number[], selector: string): number {
  if (!Array.isArray(values) || !values.every(Number.isInteger)) {
    throw new Error('Values must be a list of integers.');
  }
  if (typeof selector !== 'string' || selector.trim() === '') {
    throw new Error('Selector must be a non-empty string.');
  }

  const terms = selector.split(',').map(term => term.trim());
  if (terms.some(term => !/^\d+$|^\d+-\d+$/.test(term))) {
    throw new Error('Invalid term in selector.');
  }

  return values.filter(value =>
    terms.some(term => {
      if (/^\d+$/.test(term)) {
        return parseInt(term, 10) === value;
      } else {
        const [low, high] = term.split('-').map(Number);
        return low <= value && value <= high;
      }
    })
  ).length;
}
```