형식 술어의 형식을 매개 변수의 형식에 할당할 수 있어야 하는 이유는 무엇입니까?
유형 서술어가 있습니다.
// tslint:disable-next-line:no-any
const isString = (value: any): value is string {
return typeof value === 'string'
}
이것은 작동하지만, 린터를 비활성화해야 합니다.나는 차라리 이렇게 할 것입니다.
const isString = <T>(value: T): value is string {
return typeof value === 'string'
}
그런 식으로 유형은 아닙니다.any하지만 대신 우리는 각 유형에 대해 1개의 유형 가드 기능, 즉 1개의 기능을 가지고 있습니다.a -> Boolean매회a.
유형 스크립트에서 다음과 같은 불만이 제기됩니다.
형식 술어의 형식은 매개 변수의 형식에 할당할 수 있어야 합니다.'문자열' 유형은 'T' 유형에 할당할 수 없습니다.
이건 말이 안 돼요술어 유형이 무엇인지가 왜 중요합니까?
사용자 정의 형식 가드는 런타임 검사를 수행하여 특정 형식의 값이 형식 술어를 충족하는지 여부를 확인합니다.
값의 형식과 형식 술어의 형식 사이에 관계가 없으면 가드는 의미가 없습니다.예를 들어 TypeScript는 다음과 같은 사용자 정의 가드를 허용하지 않습니다.
function isString(value: Date): value is string {
return typeof value === "string";
}
이 오류가 발생합니다.
[ts] A type predicate's type must be assignable to its parameter's type.
Type 'string' is not assignable to type 'Date'.
A Date값은 절대로 다음이 될 수 없습니다.string따라서 가드는 무의미합니다. 런타임 검사는 불필요하며 항상 반환되어야 합니다.false.
일반적인 사용자 정의 유형 가드를 지정하는 경우T뭐든지 될 수 있어요, 그래서 - 마치.Date일부 유형의 경우 유형 가드는 말이 안 됩니다.
정말로 사용하고 싶지 않은 경우any빈 인터페이스를 사용할 수 있습니다.{}대신:
function isString(value: {}): value is string {
return typeof value === "string";
}
또한 다음을 허용하려면null그리고.undefined가드에 전달할 값은 다음과 같습니다.
function isString(value: {} | null | undefined): value is string {
return typeof value === "string";
}
오류 메시지와 관련하여 유형 가드는 덜 구체적인 유형의 값이 실제로 더 구체적인 유형의 값인지 확인하는 데 사용되기 때문에 술어 유형을 값 유형에 할당할 수 있어야 합니다.예를 들어, 이 가드를 생각해 보십시오.
function isApe(value: Animal): value is Ape {
return /* ... */
}
Ape에 할당 가능Animal하지만 그 반대는 아닙니다.
승인된 답변에 추가하여, 만약 당신이 믹스인에 대해 타입 가드를 사용해야 한다면, 당신은 또한 이 오류를 얻을 것입니다.is연산자가 다음과 같이 작동하지 않습니다.implements그럴 것이다.
interface Animal { ... }
interface Climber { ... }
interface Ape extends Animal, Climber { ... }
const isClimberMixin = (animal: Animal): animal is Climber => ...
이 코드는 다음과 같은 이유로 실패합니다.Climber에 할당할 수 없음Animal그것은 그것으로부터 연장되지 않기 때문에.
혼합 패턴을 피할 수 없다면 연합 유형을 사용하는 것이 해결책입니다.
const isClimberMixin = (animal: Animal): animal is Animal & Climber => ...
Typescript 3.0은 다음을 소개합니다.unknown이 경우에 매우 잘 작동하는 유형이며, 저는 어떤 유형이든 매개 변수로 받아들이는 모든 유형 가드 함수에 사용되어야 한다고 생각합니다.
const isString = (value: unknown): value is string => {
return typeof value === 'string'
}
본문 .typeof또는instanceof 및 하기 전에 사용합니다. 특정 유형의 메서드 및 속성을 사용하기 전에 입력합니다.이는 복잡한 유형 가드 기능과 관련이 있습니다.
더 많은 정보unknown: https://mariusschulz.com/blog/the-unknown-type-in-typescript
언급URL : https://stackoverflow.com/questions/50421015/why-must-a-type-predicates-type-be-assignable-to-its-parameters-type
'programing' 카테고리의 다른 글
| sqlalchemy의 그룹화 & 카운트 함수 (0) | 2023.06.08 |
|---|---|
| 특정 열에서 NaN이 있는 행을 선택하는 방법은 무엇입니까? (0) | 2023.06.08 |
| 메일 및 비밀번호를 사용하여 REST API [Firebase]를 통한 인증 (0) | 2023.06.08 |
| 패턴이 발생할 때마다 열 값을 분할하여 MySQL의 여러 행에 배치 (0) | 2023.06.08 |
| C#에서 바이트나 쇼트 대신 int를 사용해야 하는 이유 (0) | 2023.06.08 |