유형 및 조롱 - Typescript

이 기사에서는 TypeScript 유틸리티 유형을 사용하여 쉽게 테스트하고 모의할 수 있는 함수를 만드는 방법을 배웁니다.

다음 함수를 사용하여 입력을 어떻게 조롱합니까(예: person:

interface Person {
    name: {
        firstName: string;
        lastName: string;
    }
    id: string;
    age: number;
    height: number;
    weight: number;
}

function getPersonsFullName(person: Person) {
    return `${person.name.firstName} ${person.name.lastName}`;
}


한 가지 일반적인 방법은 함수에서 사용하는 필드만 사용하여 유형Person의 개체를 만든 다음 아래와 같이 개체를 any로 캐스팅하는 것입니다.

const person = {
    name: {
        firstName: "Wycliffe",
        lastName: "Maina"
    }
}

console.log(getPersonsFullName(person as any));


이것은 작동하지만 컴파일러가 함수에 전달되는 객체person를 유형 검사하지 않기 때문에 any로 캐스팅하면 typescript 유형 시스템의 이점을 잃게 됩니다.

이것이 좋은 생각이 아닌 이유는 함수가 변경되어 다른 속성을 사용하기 시작하거나 입력 개체의 모양이 변경되면 TypeScript가 도움이 되지 않기 때문입니다. 나는 특히 테스트를 위한 모의를 작성할 때 any 로 캐스팅하는 것에 대해 유죄입니다.

그러나 더 좋은 방법이 있습니까? 예, 위의 기능을 개선할 수 있으므로 위의 기술을 사용하지 않고 입력을 더 쉽게 조롱할 수 있습니다. 내가 정말 추천하는 한 가지 접근 방식은 함수가 성공적으로 실행되는 데 필요한 필드(이 경우 name 속성)만 있는 새 유형을 만드는 것입니다. 이것은 here 에 대해 자세히 알아볼 수 있는 유틸리티 유형을 사용하여 Typescript에서 쉽게 달성할 수 있습니다.
Pick<T> 유틸리티 유형을 사용하여 이름 필드만 있는 Person에서 새 유형을 생성할 수 있습니다. 즉, name 유형에서 Person 필드를 선택합니다.

function getPersonsFullName(person: Pick<Person, "name">) {
    return `${person.name.firstName} ${person.name.lastName}`;
}


이런 식으로 모의 예제는 여전히 작동하지만 캐스팅이 되지 않습니다.

const person = {
    name: {
        firstName: "Wycliffe",
        lastName: "Maina"
    }
}

console.log(getPersonsFullName(person));


이것의 장점은 아래와 같이 name 속성이 있는 한 더 많은 속성을 가진 person 객체를 계속 전달할 수 있다는 것입니다.

const person = {
    name: {
        firstName: "Wycliffe",
        lastName: "Maina"
    },
    id: 21
}

// this still works
console.log(getPersonsFullName(person));

Omit , Pick , Partial , Required 등과 같은 유틸리티 유형을 사용하면 함수에 대한 입력 개체의 모양을 정의하는 새 유형을 쉽게 생성할 수 있습니다. 이렇게 하면 약간의 추가 작업으로 함수 입력 유형이 무엇인지 정확하게 정의할 수 있습니다. 이전 기사here에서 TypeScript 유틸리티 유형에 대해 자세히 알아볼 수 있습니다.

이렇게 하면 필요한 것만 가져오기 때문에 함수와 메서드가 더 친숙해져서 위에서 볼 수 있는 것처럼 쉽게 조롱할 수 있습니다. 또 다른 장점은 사용하는 것보다 더 많은 입력을 요구하여 함수 소비자에게 불필요한 부담을 주지 않기 때문에 함수를 재사용할 수 있다는 것입니다.

좋은 웹페이지 즐겨찾기