TypeScript에서 윙윙거리는 소리
18540 단어 typesystemstypescriptjavascript
'쉬윙윙'이 뭐예요?
'쉬쉬윙윙'은 간단한 게임으로 회사에서 할 수 있다.플레이어는 번갈아 처음부터 계산하지만, 반드시 다음과 같은 규칙을 준수해야 한다.
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에 대한 정의Equal
와 LessThan
를 차례로 정의할 수 있다
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의 특성은 정의된 기호가 블록 밖의 동일한 표현식에서 직접 참조될 때 화가 나기 때문에 문법을 완전히 취소할 수 없다는 것을 의미하지만, 이것은 여전히 개선된 것이다. ↩
Reference
이 문제에 관하여(TypeScript에서 윙윙거리는 소리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/gypsydave5/fizz-buzz-in-typescript-7ip
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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
type TEST = Sub1<N3>
'동등'이나'소수'와 같은 검사를 사용하여 숫자의 속성을 테스트하기 위해서, 우리는 진가를 나타내는 대수가 필요하다.다행히도 이러한 상황에서 우리는 내장치를 사용할 수 있다.
type BOOL = true | false
이로써 우리는 숫자2에 대한 정의Equal
와 LessThan
를 차례로 정의할 수 있다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의 특성은 정의된 기호가 블록 밖의 동일한 표현식에서 직접 참조될 때 화가 나기 때문에 문법을 완전히 취소할 수 없다는 것을 의미하지만, 이것은 여전히 개선된 것이다. ↩
Reference
이 문제에 관하여(TypeScript에서 윙윙거리는 소리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/gypsydave5/fizz-buzz-in-typescript-7ip
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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]
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]
우리는 현재 그것을 사용하여 이전의 정의의 가독성을 높일 수 있다. 3type 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의 특성은 정의된 기호가 블록 밖의 동일한 표현식에서 직접 참조될 때 화가 나기 때문에 문법을 완전히 취소할 수 없다는 것을 의미하지만, 이것은 여전히 개선된 것이다. ↩
Reference
이 문제에 관하여(TypeScript에서 윙윙거리는 소리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/gypsydave5/fizz-buzz-in-typescript-7ip
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
type FIZZ = 'fizz'
type BUZZ = 'buzz'
type FIZZBUZZ = 'fizzbuzz'
type FB<N> = Ternary<IsMultipleOfThree<N>,
Ternary<IsMultipleOfFive<N>, FIZZBUZZ, FIZZ>,
Ternary<IsMultipleOfFive<N>, BUZZ, N>>
type TEST = FB<N15>
이 간단한 프로그램을 개선하기 위해 오류 메시지와 오류 처리를 추가할 수 있습니다.예를 들어, 지금 우리가 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의 특성은 정의된 기호가 블록 밖의 동일한 표현식에서 직접 참조될 때 화가 나기 때문에 문법을 완전히 취소할 수 없다는 것을 의미하지만, 이것은 여전히 개선된 것이다. ↩
Reference
이 문제에 관하여(TypeScript에서 윙윙거리는 소리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/gypsydave5/fizz-buzz-in-typescript-7ip
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
const fb = (n: number): number | string => (n % 3 === 0)
? ((n % 5 === 0) ? 'fizzbuzz' : 'fizz')
: ((n % 5 === 0) ? 'buzz' : n)
Reference
이 문제에 관하여(TypeScript에서 윙윙거리는 소리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/gypsydave5/fizz-buzz-in-typescript-7ip텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)