```ts
import { strict as assert } from 'assert';

/**
 * Joins a list of names into one phrase following Oxford rules.
 * @param names - Array of strings representing names to be joined.
 * @returns A string with the names joined together according to Oxford rules.
 */
export function oxfordJoin(names: string[]): string {
    if (names.length === 0) return '';
    if (names.length === 1) return names[0];

    const word = 'and';
    let result = '';

    for (let i = 0; i < names.length - 1; i++) {
        result += `${names[i]}, `;
    }

    result += word + ' ' + names[names.length - 1];

    return result;
}

// Check function to verify the correctness of the solution
function checkOxfordJoin() {
    assert.equal(oxfordJoin([]), '');
    assert.equal(oxfordJoin(['Alice']), 'Alice');
    assert.equal(oxfordJoin(['Bob', 'Charlie']), 'Bob and Charlie');
    assert.equal(oxfordJoin(['Dave', 'Eve', 'Frank']), 'Dave, Eve, and Frank');
}

// Run the check function to test the solution
checkOxfordJoin();
```