에러 메시지에서 힌트를 얻을 수 있네요. add는 값이지만 타입으로 사용했다는 뜻입니다. 그리고 typeof를 값 앞에 붙일 수 있다는 것을 알려줍니다. 변수에는 typeof를 앞에 붙여 타입으로 사용할 수 있습니다.
function add(x: number, y: number) { return x + y; }
const add2: typeof add = (x: number, y: number) => x + y;
다만 함수의 호출은 타입으로 사용할 수 없습니다. 함수의 반환값을 타입으로 사용하고 싶을 때 다음과 같은 코드를 작성하면 에러가 발생합니다.
function add(x: number, y: number) { return x + y; }
const result1: add(1, 2) = add(1, 2);
// 'add' refers to a value, but is being used as a type here. Did you mean 'typeof add'? The left-hand side of an assignment expression must be a variable or a property access.
const result2: typeof add(1, 2) = add(1, 2);
// The left-hand side of an assignment expression must be a variable or a property access.
에러 메시지에서 add는 타입이 아니라 값이고, = 연산자의 왼쪽은 변수이거나 속성 접근(property access)만 된다고 합니다. obj = 'abc'나 obj.x = 'abc' 같은 것만 가능하다는 뜻입니다. 현재 상황에서는 엉뚱한 메시지로 보일 수 있지만, = 연산자 왼쪽에 add(1, 2) 같은 함수 호출이 올 수 없다는 의미입니다.