유형 및 조롱 - Typescript
6528 단어 javascripttypescriptwebdev
다음 함수를 사용하여 입력을 어떻게 조롱합니까(예:
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 유틸리티 유형에 대해 자세히 알아볼 수 있습니다.이렇게 하면 필요한 것만 가져오기 때문에 함수와 메서드가 더 친숙해져서 위에서 볼 수 있는 것처럼 쉽게 조롱할 수 있습니다. 또 다른 장점은 사용하는 것보다 더 많은 입력을 요구하여 함수 소비자에게 불필요한 부담을 주지 않기 때문에 함수를 재사용할 수 있다는 것입니다.
Reference
이 문제에 관하여(유형 및 조롱 - Typescript), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/this-is-learning/types-and-mocking-typescript-1m00텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)