해결된 질문
작성
·
17
·
수정됨
1
안녕하세요
js 에서 함수가 객체라는것은 이해했습니다.
그래서 개념이 약간 헷갈려서요.
type Operation2 = {
(a : number , b:number): number,
sing: string;
}
let add3 : Operation2 = Object.assign(
(a: number, b: number) => a + b,
{ sing: "hello" }
);
저 자리는 객체랑 객체를 합쳐서 새로운 합쳐전 객체를 반환하는 assign 함수인데 익명함수를 써 둔것은 함수가 객체이기때문에 라고 이해됐습니다.
혼동되는게 ts 에서는 object타입이랑 함수타입이랑 나눠져있어서 혼동됩니다.
함수는 객체인데 또 타입은 함수타입 부분에서 혼동이 되는데 js에서는 함수도 일급객체라고해서요.
함수는 객체인데 타입은 함수타입?..? 이 맞는거죠?
호출할 수 있는 객체 타입(callable object type)”은 곧 함수 타입(function type) 이다.
이 표현이 맞을까요???
답변 2
1
안녕하세요 이정환입니다.
function은 호출 가능한 형태의 object 라고 이해하시면 됩니다.
위에 첨부해주신 그림에도 obejct 타입이 function의 슈퍼타입(부모 집합)으로 표시되어 있는 것 처럼, function(함수)는 object(객체)에 포함되는 개념입니다.
number 타입 아래에 10, 20 과 같은 number 리터럴 타입이 존재하는것과 비슷한 느낌이라고 이해하시면 되겠습니다 !_!
0
안녕하세요, 인프런 AI 인턴입니다. gxpk0721님.
타입스크립트와 자바스크립트에서의 함수 타입과 객체 타입에 대한 혼란스러움을 설명해드리겠습니다.
자바스크립트에서 함수는 “일급 객체(first-class citizens)“입니다. 이것은 함수가 객체로서 다뤄질 수 있음을 의미하죠. 즉, 함수는 변수에 할당될 수도 있고, 다른 함수의 매개변수로 전달될 수도 있으며, 객체지향적으로는 객체의 프로퍼티로도 추가될 수 있습니다. 이것이 함수를 객체라고 부를 수 있는 이유입니다.
타입스크립트는 이러한 자바스크립트의 특성을 그대로 활용하지만, 추가적으로 정적 타입 시스템을 추가하여 좀 더 명확한 코드 작성을 돕습니다. 따라서 타입스크립트에서는 함수에 대해 구체적인 “함수 타입”을 정의할 수 있습니다.
함수 타입을 정의할 때에는, 함수의 매개변수와 반환 타입을 명시하여 타입의 일관성을 유지할 수 있습니다. 예를 들어, type Operation = (a: number, b: number) => number;
와 같이 함수의 구조를 정의합니다. 반면, 일반 객체 타입은 type ObjType = { prop1: string; prop2: number; };
과 같은 방식으로 정의합니다.
제공해주신 코드에서 Object.assign
을 통해 함수를 객체와 합치는 과정은 자바스크립트에서 함수가 객체로 취급될 수 있음을 보여줍니다.
type Operation2 = {
(a: number, b: number): number;
sing: string;
}
let add3: Operation2 = Object.assign(
(a: number, b: number) => a + b,
{ sing: "hello" }
);
위의 Operation2
타입 정의는 함수 타입과 객체 타입을 동시에 표현한 형태입니다. 여기서 (a: number, b: number): number;
부분이 함수 타입을 뜻하며, sing: string;
부분이 해당 함수라는 객체의 프로퍼티를 정의하는 부분입니다.
따라서, 타입스크립트에서 함수는 ‘객체’로 취급될 수 있지만, 타입 체계상에서는 함수의 형태를 보다 명확히 규정하기 위해 ‘함수 타입’이라는 개념을 사용해 구분합니다. 자바스크립트에서는 함수도 객체라는 점을 기억하되, 타입스크립트에서는 이 객체로서의 성질을 타입으로 구현할 수 있다는 점이 흥미로운 점입니다.
이미지 URL과 원본 URL:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.