void와 함께 함수 인터페이스를 사용할 때 예기치 않은 유형 스크립트 컴파일러 동작

제이크 장

반환 유형을 숫자로 사용하여 함수 인터페이스를 정의하면 컴파일러가 경고합니다.


interface RequestHandler {
    (): number
}

// the compiler will prompt an error
// because " Type '() => boolean' is not assignable to type 'RequestHandler'" 
const handler: RequestHandler = function (): boolean {
    return false
}

그러나 이렇게하면 컴파일러가 괜찮아 보입니다.

interface RequestHandler {
    (): void
}

const handler: RequestHandler = function (): boolean {
    return false
}

처음에는 void 반환 유형을 사용하는 함수가 모든 반환 유형을 허용한다고 생각했는데 이는 다음과 같이 잘못되었습니다.

// error TS2322: Type 'boolean' is not assignable to type 'void'
function foo(): void {
    return true
}

내 가정이 타당하지 않다고 생각합니다. 누구든지 그러한 행동을 설명 할 수 있습니까?


Edit ABOS의 답변은이 동작에 대해 더 많이 찾도록 영감을 얻었습니다. 데모로 새 코드 조각을 올릴 것입니다.

class Animal {
    eat() {}
}

// Dog is a subtype of Animal
class Dog extends Animal {
    bark() {}
}

interface AnimalBuilder {
    (): Animal
}

interface DogBuilder {
    (): Dog
}
// DogBuilder is a subtype of Animal Builder

declare let animalBuilder: AnimalBuilder
declare let dogBuilder: DogBuilder

// this demonstrate "co-variance"
animalBuilder = dogBuilder // Ok
dogBuilder = animalBuilder // Error

interface AnimalFeeder {
    (animal: Animal): void
}

interface DogFeeder {
    (dog: Dog): void
}
// ...while AnimalFeeder is a subtype of DogFeeder (under "strictFunctionTypes")
// this is called "contra-variance"
// Although counter-intuitive at first glance, it ensures stronger type safety 


declare let animalFeeder: AnimalFeeder
declare let dogFeeder: DogFeeder

// "contravariance"
dogFeeder = animalFeeder // Ok
animalFeeder = dogFeeder // Error when "--strictFunctionTypes"
// Ok when "strictFunctionTypes" is set to false, bi-variance

신청

내 이해 : 두 가지 유형 호환성 검사가 있습니다.

에 대한

const handler: RequestHandler = function (): boolean {
    return false
}

여기서 일어나는 일은 Comparing two functions 에 따라 반환 유형 부울 함수가 void에 할당 될 수 있다는 것 입니다. 이 섹션의 맨 아래에있는 예와 "유형 시스템은 소스 함수의 반환 유형이 대상 유형의 반환 유형의 하위 유형이되도록 강제합니다."라는 문을 참고하십시오. 여기의 경우 void는 부울의 하위 유형입니다.

에 대한

// error TS2322: Type 'boolean' is not assignable to type 'void'
function foo(): void {
    return true
}

여기서 일어나는 일은 첫 번째 경우와 달리 데이터 유형 비교입니다. 따라서 예상대로 일치하지 않는 유형에 대해 불평합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

rpy2와 함께 R 샘플 함수를 사용할 때 예기치 않은 동작이 발생합니까?

분류에서Dev

오디오 서비스와 함께 사용할 때 mContext 유형 불일치

분류에서Dev

크로스 컴파일러, 정의되지 않은 기호와 함께 gcc 플러그인 사용

분류에서Dev

JavaScript와 함께 PHP를 사용할 때 예기치 않은 토큰 오류

분류에서Dev

Redux saga는 일반 함수 유형 유형 스크립트와 함께 호출 효과를 사용합니다.

분류에서Dev

포인터를 사용할 때 예기치 않은 동작 및 컴파일러 오류

분류에서Dev

JAVA에서 FileDescriptor의 내부 및 외부 정적 멤버와 함께 사용될 때 FileInputStream 및 FileOutputStream 클래스의 예기치 않은 동작

분류에서Dev

getter 함수를 사용하여 참조 인수를 전달할 때 예기치 않은 동작

분류에서Dev

하위 모듈에서 생성자 함수를 사용할 때 예기치 않은 "double"네임 스페이스

분류에서Dev

하위 모듈에서 생성자 함수를 사용할 때 예기치 않은 "double"네임 스페이스

분류에서Dev

컴파일러 최적화와 함께 std :: function 클래스 멤버를 사용할 때 Segfault

분류에서Dev

필터 함수를 연결할 때 예기치 않은 인덱스 값

분류에서Dev

cut () 함수를 사용할 때 예기치 않은 ')'오류

분류에서Dev

함수를 사용할 때 Jquery 예기치 않은 토큰

분류에서Dev

자바 스크립트 분할 기능과 함께 와일드 카드 사용

분류에서Dev

htaccess 파일 존재 확인이 apache Alias와 함께 사용할 때 작동하지 않는 것 같습니다.

분류에서Dev

스크립트는 PHP의 토큰 유효성 검사와 함께 작동하지 않습니다.

분류에서Dev

유형 추론은 유형이 다른 유형과 함께 작동 할 때 유형을 파악할 수있을만큼 똑똑합니다.

분류에서Dev

유형 추론은 유형이 다른 유형과 함께 작동 할 때 유형을 파악할 수있을만큼 똑똑합니다.

분류에서Dev

파일을 바이트 크기로 분할 할 때 예기치 않은 동작

분류에서Dev

완료 핸들러와 함께 함수를 사용할 때 변수가 초기화되지 않음

분류에서Dev

동적 인수를 사용하여 일반 확장 메서드를 호출 할 때 C # 컴파일러가 잘못된 오류와 함께 실패합니다.

분류에서Dev

예상 스크립트-변수와 함께 파일 이름 보내기

분류에서Dev

SwiftUI-iPadOS 및 Catalyst에서 마우스 / 트랙 패드와 함께 onTapGesture를 사용하는 예기치 않은 동작

분류에서Dev

sass 함수와 함께 사용할 때 Sass 나누기가 작동하지 않습니다.

분류에서Dev

컴파일러가 유형을 추론 할 수있을 때 함수에 유형 서명을 사용하는 좋은 이유는 무엇입니까?

분류에서Dev

html helper chechkboxfor와 함께 사용할 때 부트 스트랩 토글 chechkbox가 작동하지 않습니까?

분류에서Dev

정규식 코드를 테스트했지만 sed와 함께 사용할 때 일치하지 않음

분류에서Dev

상속과 함께 사용할 때`alias_method` 또는`alias` 키워드의 예기치 않은 동작

Related 관련 기사

  1. 1

    rpy2와 함께 R 샘플 함수를 사용할 때 예기치 않은 동작이 발생합니까?

  2. 2

    오디오 서비스와 함께 사용할 때 mContext 유형 불일치

  3. 3

    크로스 컴파일러, 정의되지 않은 기호와 함께 gcc 플러그인 사용

  4. 4

    JavaScript와 함께 PHP를 사용할 때 예기치 않은 토큰 오류

  5. 5

    Redux saga는 일반 함수 유형 유형 스크립트와 함께 호출 효과를 사용합니다.

  6. 6

    포인터를 사용할 때 예기치 않은 동작 및 컴파일러 오류

  7. 7

    JAVA에서 FileDescriptor의 내부 및 외부 정적 멤버와 함께 사용될 때 FileInputStream 및 FileOutputStream 클래스의 예기치 않은 동작

  8. 8

    getter 함수를 사용하여 참조 인수를 전달할 때 예기치 않은 동작

  9. 9

    하위 모듈에서 생성자 함수를 사용할 때 예기치 않은 "double"네임 스페이스

  10. 10

    하위 모듈에서 생성자 함수를 사용할 때 예기치 않은 "double"네임 스페이스

  11. 11

    컴파일러 최적화와 함께 std :: function 클래스 멤버를 사용할 때 Segfault

  12. 12

    필터 함수를 연결할 때 예기치 않은 인덱스 값

  13. 13

    cut () 함수를 사용할 때 예기치 않은 ')'오류

  14. 14

    함수를 사용할 때 Jquery 예기치 않은 토큰

  15. 15

    자바 스크립트 분할 기능과 함께 와일드 카드 사용

  16. 16

    htaccess 파일 존재 확인이 apache Alias와 함께 사용할 때 작동하지 않는 것 같습니다.

  17. 17

    스크립트는 PHP의 토큰 유효성 검사와 함께 작동하지 않습니다.

  18. 18

    유형 추론은 유형이 다른 유형과 함께 작동 할 때 유형을 파악할 수있을만큼 똑똑합니다.

  19. 19

    유형 추론은 유형이 다른 유형과 함께 작동 할 때 유형을 파악할 수있을만큼 똑똑합니다.

  20. 20

    파일을 바이트 크기로 분할 할 때 예기치 않은 동작

  21. 21

    완료 핸들러와 함께 함수를 사용할 때 변수가 초기화되지 않음

  22. 22

    동적 인수를 사용하여 일반 확장 메서드를 호출 할 때 C # 컴파일러가 잘못된 오류와 함께 실패합니다.

  23. 23

    예상 스크립트-변수와 함께 파일 이름 보내기

  24. 24

    SwiftUI-iPadOS 및 Catalyst에서 마우스 / 트랙 패드와 함께 onTapGesture를 사용하는 예기치 않은 동작

  25. 25

    sass 함수와 함께 사용할 때 Sass 나누기가 작동하지 않습니다.

  26. 26

    컴파일러가 유형을 추론 할 수있을 때 함수에 유형 서명을 사용하는 좋은 이유는 무엇입니까?

  27. 27

    html helper chechkboxfor와 함께 사용할 때 부트 스트랩 토글 chechkbox가 작동하지 않습니까?

  28. 28

    정규식 코드를 테스트했지만 sed와 함께 사용할 때 일치하지 않음

  29. 29

    상속과 함께 사용할 때`alias_method` 또는`alias` 키워드의 예기치 않은 동작

뜨겁다태그

보관