TypeScript에서 윙윙거리는 소리

소프트웨어 개발자로서 우리는 취업을 확보하기 위해 프로그래밍 언어의 기본 능력을 보여 달라는 요청을 자주 받는다.TypeScript는 현재 매우 유행하고 있으며, 이것은 우리가 그 중에서 간단한 연습을 자유롭게 작성할 수 있다는 것을 의미한다.이 글은 다른 언어나 라이브러리에 의존하지 않고 순수한 TypeScript로'fizz buzz'를 작성하는 방법을 보여 줍니다.

'쉬윙윙'이 뭐예요?


'쉬쉬윙윙'은 간단한 게임으로 회사에서 할 수 있다.플레이어는 번갈아 처음부터 계산하지만, 반드시 다음과 같은 규칙을 준수해야 한다.
  • 만약 한 숫자가 세 가지로 정리될 수 있다면, "쉬쉬!"라고 말해라.반대
  • 숫자 하나가 5로 정리되면 "버즈!"반대
  • 숫자 하나가 3과 5로 정리될 수 있다면, "윙윙!"
  • 그렇지 않으면 평소처럼 숫자를 말해야 한다
  • 이것은 보통 연습으로 번역된다. 프로그램에 숫자를 제공할 때, 프로그램이 윙윙거리는 게임을 하고 있다면, 정확한 반응을 보일 것이다.

    1단계: 숫자


    우선, 우리는 약간의 숫자가 필요하다.불행하게도, TypeScript에는 미리 정의된 디지털 시스템이 없기 때문에, 우리는 일부 문자를 포함하여 스스로 작성해야 한다.다행히도 우리는 자연수만 필요로 한다. 즉, easily defined:
    type N = Z | S<unknown>
    type Z = 0
    type S<N> = [S]
    
    이를 통해 우리는 다음과 같은 목적을 달성하기 위해 충분한 숫자 문자를 신속하게 정의할 수 있습니다.
    type N1 = S<Z>
    type N2 = S<N1>
    // ...
    type N14 = S<N13>
    type N15 = S<N14>
    
    우리는 단지 이 숫자들을 한 번 연산하여 숫자에서 하나를 빼는 방법일 뿐이다.
    type Sub1<N> = N extends S<infer P> ? P : Z
    
    다른 산수 연산은 독자에게 연습으로 남겨 두어야 한다.
    이 모든 것이 정상인지 확인하기 위해서 TypeScript 해석기를 통해 프로그램을 실행해야 합니다.가장 빠른 방법은 VSCode에 다음 표현식을 쓰는 것입니다. 1
    type TEST = Sub1<N3>
    
    커서를 TEST 위에 놓습니다.표시된 해석 표현식을 볼 수 있을 것입니다.

    2단계: 진실


    '동등'이나'소수'와 같은 검사를 사용하여 숫자의 속성을 테스트하기 위해서, 우리는 진가를 나타내는 대수가 필요하다.다행히도 이러한 상황에서 우리는 내장치를 사용할 수 있다.
    type BOOL = true | false
    
    이로써 우리는 숫자2에 대한 정의EqualLessThan를 차례로 정의할 수 있다
    type Equal<Na, Nb> = {
        0: Nb extends Z ? true : false
        1: {
            0: false,
            1: Na extends S<infer Pa> ? Nb extends S<infer Pb>
                ? Equal<Pa, Pb>
                : never
                : never
        }[Nb extends Z ? 0 : 1]
    }[Na extends Z ? 0 : 1]
    
    type LessThan<Na, Nb> = {
        0: false,
        1: Na extends Z ? true
            : Na extends S<infer Pa> ? Nb extends S<infer Pb>
            ? LessThan<Pa, Pb>
            : never
            : never
    }[Nb extends Z ? 0 : 1]
    
    마찬가지로 수동으로 테스트할 수 있습니다.
    type TEST = Equal<N1, N1>
    

    3단계: 술어


    우리가 fizz buzz를 실현해야 하는 두 가지 중요한 술어는 IsMultipleOfThree이다.
    type IsMultipleOfThree<T> = {
        1: true
        0: {
            0: false,
            1: IsMultipleOfFive<Sub1<Sub1<Sub1<T>>>>
        }[LessThan<T, N5> extends true ? 0 : 1]
    }[Equal<T, N5> extends true ? 1 : 0]
    
    매우 비슷함 IsMultipleOfFive:
    type IsMultipleOfFive<T> = {
        1: true
        0: {
            0: false,
            1: IsMultipleOfFive<Sub1<Sub1<Sub1<Sub1<Sub1<T>>>>>>
        }[LessThan<T, N5> extends true ? 0 : 1]
    }[Equal<T, N5> extends true ? 1 : 0]
    
    상술한 방법과 유사한 방식으로 테스트를 작성하여 상술한 방법의 유효성을 증명할 수 있습니다.

    재구성


    우리의 코드에는 다음과 같은 패턴이 반복됩니다.
    type Ternary<B, P, Q> = {
        1: P,
        0: Q
    }[B extends true ? 1 : 0]
    
    우리는 현재 그것을 사용하여 이전의 정의의 가독성을 높일 수 있다. 3
    type IsMultipleOfThree<T> = {
        1: true
        0: Ternary<LessThan<T, N3>,
                     false,
                     T extends S<S<S<infer P>>>
                        ? IsMultipleOfThree<P>
                        : never>
    }[Equal<T, N3> extends true ? 1 : 0]
    

    4단계: 쉬쉬하는 소리


    이제 우리는 마침내 우리의fizzbuzz 프로그램을 작성할 수 있게 되었다.가능한 출력을 정의해야 합니다.
    type FIZZ = 'fizz'
    type BUZZ = 'buzz'
    type FIZZBUZZ = 'fizzbuzz'
    
    이것은 우리가 이전에 정의한 Ternary 함수와 함께fizz buzz 프로그램을 매우 간결하고 표현적으로 작성할 수 있도록 합니다.
    type FB<N> = Ternary<IsMultipleOfThree<N>,
        Ternary<IsMultipleOfFive<N>, FIZZBUZZ, FIZZ>,
        Ternary<IsMultipleOfFive<N>, BUZZ, N>>
    
    위에서 설명한 대로 테스트(및 사용):
    type TEST = FB<N15>
    

    

    5단계: 한 단계 더 나아가기


    이 간단한 프로그램을 개선하기 위해 오류 메시지와 오류 처리를 추가할 수 있습니다.예를 들어, 지금 우리가 0에서 1을 빼면, 우리는 0을 얻고, 실제로 우리는 어떤 잘못을 보아야 한다.우리는 또 이런 잘못을 어떻게 처리해야 할지 생각해야 한다.
    그 밖에 많은 울부짖는 연습은 이 조작을 여러 숫자에 동시에 응용하여 특정한 목록 구조로 진행해야 한다.마찬가지로 이러한 구조는 TypeScript에는 존재하지 않지만 위와 같은 방법으로 신속하게 정의할 수 있습니다.

    마지막 생각


    경험이 적은 개발자들은 쉬쉬하는 윙윙거리는 소리를 해결하기 위해 자바스크립트를 사용할 수 있다. 자바스크립트는 TypeScript를 세분화하고 문법을 삽입하는 언어이다.예:
    const fb = (n: number): number | string => (n % 3 === 0)
        ? ((n % 5 === 0) ? 'fizzbuzz' : 'fizz')
        : ((n % 5 === 0) ? 'buzz' : n)
    
    그러나 분명히 이 코드는 자바스크립트로 작성된 것일 뿐, TypeScript 내장 값을 TypeScript로 작성된 것이 아니라, TypeScript로 작성된 것이다. 모두가 알다시피 TypeScript는 동적 형식과 해석의 프로그래밍 언어이다.
    이 글은 켈 킹스베리(Kyle Kingsbury)this post의 계발을 받아 나에게 빛을 보여 주었다.
    편집: 변경 실현, 왜냐하면 나는 할 수 있기 때문에...
    VSCode는 표현식을 정확하게 계산하기 때문에 지금까지 사용할 수 있는 가장 좋은 TypeScript 해석기입니다.반대로 IntelliJ는 약간의 귀속이나 끼워 넣은 표현식을 계산할 수 없을 정도로 결함이 있다.이 해석기들의 인체공학은 모두 매우 기이하다. 만약 누군가가 편집기가 끼워져 있지 않은 간단한 타자 해석기를 작성할 수 있다면 좋겠다. 
    TypeScript 구문의 일부 특성은 반복적으로 작성하기 위해 약간의 간접성을 도입해야 한다는 것을 의미한다.이것은 다시 한 번 유감스럽다. 
    마찬가지로, TypeScript의 특성은 정의된 기호가 블록 밖의 동일한 표현식에서 직접 참조될 때 화가 나기 때문에 문법을 완전히 취소할 수 없다는 것을 의미하지만, 이것은 여전히 개선된 것이다. 

    좋은 웹페이지 즐겨찾기