이 정의되지 않은 검사가 찾기 기능에서 작동하지 않는 이유는 무엇입니까?

blub

다음 예에서 변수가 왜 누군가가 설명 할 수 z유형이 number있지만, 호출 내에서 f1(x.y), x.y유형이number | undefined

const f1 = (value: number) => !!value;

const f2 = (x: { y: number | undefined}): void => {
    if (x.y === undefined || !isFinite(x.y)) {
        throw new Error('Not a number');
    }

    const z = x.y; // z & x.y has type number 
    ['stuff', 'here'].find(item => f1(x.y)); // x.y has type number | undefined
};

놀이터 예

Nishant

저는이 질문이 정말 마음에 들었고 조사를했고 뭔가를 배웠습니다. OP가 언급했듯이 클로저, 특히 콜백과 관련이 있습니다. 그들이 오는 것을 설명하려고 노력하는 아래 코드에서 내 의견을 읽으십시오.

const f1 = (value: number) => !!value;

const f2 = (x: { y: number | undefined}): void => {
    if (x.y === undefined || !isFinite(x.y)) {
        throw new Error('Not a number');
    }

    // Here, you have ensured here that type of z is not changing
    const z = x.y;

    // `x.y` is mutable, 
    // As jcalz correctly mentioned in the comment, 
    // the compiler does not know that the `find` function executes the 
    // callback synchronously and immediately, and it is expensive
    // to check if anyone has altered its type elsewhere before the 
    // callback was executed. So, it can't
    // guarantee that the type of `x.y` stays number
    // hence, Typescript expands `x.y` back to `number | undefined`
    ['stuff', 'here'].find(item => f1(x.y));

    
    // This however knows type isn't changing
    ['stuff', 'here'].find(item => f1(z));

    // However, this works because Typescript optimistically thinks
    // the function, in our case `find`, does not have a side effect
    // (referring the article noted below)
    f1(x.y);

    // In a parallel universe, where `find` is 
    // asynchronous like `timeout`,
    // and executes the callback sometime later
    // and we had the following line here
    x.y = undefined
    // Since the `find` function, in our parallel universe, 
    // would call the callback
    // after we have assigned `x.y` as `undefined`
    // it makes sense to expand the type in the callback within the find
    // function back to number | undefined
};

여기에 흥미로운 기사가 ​​있습니다. 정말 좋은 읽기 : https://herringtondarkholme.github.io/2017/02/04/flow-sensitive/

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

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

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

var 검사기가 정의되지 않은 이유는 무엇입니까?

분류에서Dev

iOS에서 기능이 더 이상 사용되지 않는 이유를 찾는 방법은 무엇입니까?

분류에서Dev

MainActivity에서 SMSReceived에서 가져온 기능이 작동하지 않는 이유는 무엇입니까?

분류에서Dev

이 추가 기능이 때때로 PHP에서 작동하지 않는 이유는 무엇입니까?

분류에서Dev

랜덤 사용자 API에 대한 검색 기능이 작동하지 않는 이유는 무엇입니까?

분류에서Dev

기능 키가 Windows에서 기본적으로 작동하지 않는 이유는 무엇입니까?

분류에서Dev

암호 해독 기능에서이 루프가 작동하지 않는 이유는 무엇입니까?

분류에서Dev

Angular 앱의 비동기 사용자 지정 유효성 검사기가 입력 된 입력에서는 작동하지만 붙여 넣은 입력에서는 작동하지 않는 이유는 무엇입니까?

분류에서Dev

여기에서 .each가 작동하지 않는 이유는 무엇입니까?

분류에서Dev

내 JavaScript 유효성 검사기가 작동하지 않는 이유는 무엇입니까?

분류에서Dev

내 ORMLite 사용자 지정 지속 기가 Android에서 작동하지 않는 이유는 무엇입니까?

분류에서Dev

기본 클래스가 정의되지 않은 이유는 무엇입니까?

분류에서Dev

full_messages 기능에서 삭제가 작동하지 않는 이유는 무엇입니까?

분류에서Dev

정의되지 않은 검사 방법이 작동하지 않는 이유는 무엇입니까?

분류에서Dev

이 기능이 작동하지 않지만 Eclipse에서 오류가 표시되지 않는 이유는 무엇입니까?

분류에서Dev

기능이 정의되지 않은 이유는 무엇입니까?

분류에서Dev

내 비밀번호 검사기가 작동하지 않는 이유는 무엇입니까? 씨#

분류에서Dev

(python) .append ()가 여기서 작동하지 않는 이유는 무엇입니까?

분류에서Dev

img : hover가 여기서 작동하지 않는 이유는 무엇입니까?

분류에서Dev

typedef가 여기서 작동하지 않는 이유는 무엇입니까?

분류에서Dev

Jquery 여기서 toggleClass가 작동하지 않는 이유는 무엇입니까?

분류에서Dev

이 chained : not 선택기가 작동하지 않는 이유는 무엇입니까?

분류에서Dev

이 선택기가 작동하지 않는 이유는 무엇입니까? JS

분류에서Dev

`동기화 (new Object ()) {}`가 작동하지 않는 이유는 무엇입니까?

분류에서Dev

자동 채우기가 작동하지 않는 이유는 무엇입니까?

분류에서Dev

Keras 사용자 지정 손실 기능이 작동하지 않는 이유는 무엇입니까?

분류에서Dev

CSS의 : not 선택기가 지정된 요소없이 작동하지 않는 이유는 무엇입니까?

분류에서Dev

높이가 정의되지 않은 경우 배경 크기 포함이 HTML 또는 BODY에서 작동하지 않지만 배경 크기 커버가 작동하는 이유는 무엇입니까?

분류에서Dev

내 코드가 작동하지 않는 이유는 무엇입니까? 경기 전 단어 찾기

Related 관련 기사

  1. 1

    var 검사기가 정의되지 않은 이유는 무엇입니까?

  2. 2

    iOS에서 기능이 더 이상 사용되지 않는 이유를 찾는 방법은 무엇입니까?

  3. 3

    MainActivity에서 SMSReceived에서 가져온 기능이 작동하지 않는 이유는 무엇입니까?

  4. 4

    이 추가 기능이 때때로 PHP에서 작동하지 않는 이유는 무엇입니까?

  5. 5

    랜덤 사용자 API에 대한 검색 기능이 작동하지 않는 이유는 무엇입니까?

  6. 6

    기능 키가 Windows에서 기본적으로 작동하지 않는 이유는 무엇입니까?

  7. 7

    암호 해독 기능에서이 루프가 작동하지 않는 이유는 무엇입니까?

  8. 8

    Angular 앱의 비동기 사용자 지정 유효성 검사기가 입력 된 입력에서는 작동하지만 붙여 넣은 입력에서는 작동하지 않는 이유는 무엇입니까?

  9. 9

    여기에서 .each가 작동하지 않는 이유는 무엇입니까?

  10. 10

    내 JavaScript 유효성 검사기가 작동하지 않는 이유는 무엇입니까?

  11. 11

    내 ORMLite 사용자 지정 지속 기가 Android에서 작동하지 않는 이유는 무엇입니까?

  12. 12

    기본 클래스가 정의되지 않은 이유는 무엇입니까?

  13. 13

    full_messages 기능에서 삭제가 작동하지 않는 이유는 무엇입니까?

  14. 14

    정의되지 않은 검사 방법이 작동하지 않는 이유는 무엇입니까?

  15. 15

    이 기능이 작동하지 않지만 Eclipse에서 오류가 표시되지 않는 이유는 무엇입니까?

  16. 16

    기능이 정의되지 않은 이유는 무엇입니까?

  17. 17

    내 비밀번호 검사기가 작동하지 않는 이유는 무엇입니까? 씨#

  18. 18

    (python) .append ()가 여기서 작동하지 않는 이유는 무엇입니까?

  19. 19

    img : hover가 여기서 작동하지 않는 이유는 무엇입니까?

  20. 20

    typedef가 여기서 작동하지 않는 이유는 무엇입니까?

  21. 21

    Jquery 여기서 toggleClass가 작동하지 않는 이유는 무엇입니까?

  22. 22

    이 chained : not 선택기가 작동하지 않는 이유는 무엇입니까?

  23. 23

    이 선택기가 작동하지 않는 이유는 무엇입니까? JS

  24. 24

    `동기화 (new Object ()) {}`가 작동하지 않는 이유는 무엇입니까?

  25. 25

    자동 채우기가 작동하지 않는 이유는 무엇입니까?

  26. 26

    Keras 사용자 지정 손실 기능이 작동하지 않는 이유는 무엇입니까?

  27. 27

    CSS의 : not 선택기가 지정된 요소없이 작동하지 않는 이유는 무엇입니까?

  28. 28

    높이가 정의되지 않은 경우 배경 크기 포함이 HTML 또는 BODY에서 작동하지 않지만 배경 크기 커버가 작동하는 이유는 무엇입니까?

  29. 29

    내 코드가 작동하지 않는 이유는 무엇입니까? 경기 전 단어 찾기

뜨겁다태그

보관