Skip to content

Commit 25045a0

Browse files
committedDec 20, 2021
feat(ts-challenge): complete some ts challenge
1 parent 4ce31a8 commit 25045a0

20 files changed

+374
-3
lines changed
 

‎src/.DS_Store

2 KB
Binary file not shown.

‎src/playground/js/generator.ts

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
// // // function* gen() {
2+
// // // console.log(0);
3+
// // // let res = (yield console.log(1)) as 1;
4+
// // // console.log(res);
5+
// // // return 1;
6+
// // // }
7+
8+
// // let g = gen();
9+
// // g.next(1);
10+
// // g.next();
11+
// const g = function* (x: number, y: number) {
12+
// let result = (yield x + y) as number;
13+
// // let x = yield 2;
14+
15+
// return result;
16+
// };
17+
18+
// const gen = g(1, 2);
19+
// console.log(gen.next()); // Object {value: 3, done: false}
20+
// gen.next(0)); // Object {value: 0, done: false}
21+
// console.log(gen.next(1)); // Object {value: 1, done: true}
22+
23+
// // // let g = gen();
24+
// // // // @ts-ignore
25+
// // // console.log(g.next(1));
26+
// // // // @ts-ignore
27+
// // // console.log(g.next(1));
28+
// // // // @ts-ignore
29+
// // // console.log(g.next(1));
30+
// // // // @ts-ignore
31+
// // // console.log(g.next(1));
32+
// // // // @ts-ignore
33+
// // // console.log(g.next(1));
34+
// // function* gen(): Generator<1 | 2 | 3, 1, { a: 1 }> {
35+
// // yield 1;
36+
// // yield 2;
37+
// // yield 3;
38+
// // return 1 as const;
39+
// // }
40+
// // // 参数是逆变的
41+
// // function* gengen() {
42+
// // yield* gen();
43+
// // let bar = (yield 1) as { b: 2 };
44+
// // console.log(bar);
45+
// // return 1;
46+
// // }
47+
48+
// // type _ = 1 | undefined;
49+
// // type _ = 1 & undefined;
50+
51+
// // let g = gen();
52+
// // g.next(1);
53+
// // // function* gengen() {
54+
// // // const res = yield* gen();
55+
// // // yield 4;
56+
// // // return res;
57+
// // // }
58+
// // let g: any;
59+
60+
// // for (let i of gen()) {
61+
// // g = i;
62+
// // console.log(i);
63+
// // }
64+
65+
// // console.log(g.next());
66+
// // // console.log(g.next());
67+
// // // console.log(g.next());
68+
// // // console.log(g.return(1));
69+
// // // console.log(g.next());

‎src/regexp/index.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
let reg;
2+
// 匹配连续出现的四组以 . 连接的字符串
3+
// + abc.dss.sds.wer
4+
reg = /^(...\.){3}...$/;
5+
console.log(reg.test('255.255.255.255')); // true
6+
reg = /^(.{3}\.){3}.{3}$/;
7+
console.log(reg.test('255.255.255.255')); // true
8+
9+
// 匹配十六进制颜色
10+
reg = /^#?[a-fA-F0-9]{6}|[a-fA-F0-9]{3}$/;
11+
console.log(reg.test('#FFFFFF'));
12+
13+
// 邮箱
14+
reg = /^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/;
15+
console.log(reg.test('893930581@weixin.qq.com'));

‎src/regexp/matchParenthesis.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
const isMatchedParenthesisV1 = (str) => {
2+
const reg = /<([^>]+)>.*?<\/\1>/g
3+
return reg.test(str);
4+
}
5+
6+
const isMatchedParenthesisV1 = (str) => {
7+
const reg = /<([^>]+)>.*?<\/\1>/g
8+
return reg.test(str);
9+
}
10+
11+
console.log(isMatchedParenthesis('<p></p>'))
12+
console.log(isMatchedParenthesis('<div></p>'))
13+
console.log(isMatchedParenthesis('<div><p></div>'))

‎src/regexp/number3AGroup.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
2+
// 将123456789转化为123,456,789
3+
console.log('123456789'.replace(/(?=\d{3})/g, ','))

‎src/type-challenge/easy/Awaited.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
//!pass
2-
type Await<T> = T extends Promise<infer C> ? C : never;
2+
type Await<T> = T extends Promise<infer C> ? C : T;
33

4-
type awa = Await<Promise<string>>;
4+
type awa = Await<Promise<string> | number>;
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// !pass
2+
export type ClassPublicKeys<T> = helper<T, keyof T>;
3+
4+
type helper<T, K> = K extends keyof T
5+
? T extends { [KK in K]: T[K] }
6+
? K
7+
: never
8+
: never;
9+
10+
type Constructor<T> = new (...args: any[]) => T;
11+
export type ClassPublicKeysSimple<T extends Constructor<T>> = keyof T;
12+
13+
class A {name: string = '1'; num: number = 1;}
14+
15+
type publicKyes = ClassPublicKeys<A>; // 'str' | 'getNum'
16+
17+
18+
// @show-types
19+
type AKey = keyof A;
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// 若数组则类型报错
2+
type ErrorIfArray<T> = T extends any[] ? '非数组类型' : T;
3+
export const isNilString = (str: any): str is null | undefined | '' =>
4+
str === '' || str === null || str === undefined;
5+
6+
export function toArray<T>(
7+
value: ErrorIfArray<T>
8+
): Exclude<ErrorIfArray<T>, undefined | null | ''>[] | undefined {
9+
if (isNilString(value)) {
10+
return undefined;
11+
}
12+
13+
return [value as Exclude<ErrorIfArray<T>, undefined | null | ''>];
14+
}
15+
16+
type TEST1 = ErrorIfArray<never[]>;
17+
18+
type isExtends = any[] extends [] ? true : false;
19+
20+
// console.log(toArray([])); error

‎src/type-challenge/hard/Get.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// !DONE
2+
export type Get<T, Path extends string> = Path extends `${infer K}.${infer R}`
3+
? K extends keyof T
4+
? Get<T[K], R>
5+
: never
6+
: Path extends keyof T
7+
? T[Path]
8+
: never;
9+
10+
type Data = {
11+
foo: {
12+
bar: {
13+
value: 'foobar';
14+
count: 6;
15+
};
16+
included: true;
17+
};
18+
hello: 'world';
19+
};
20+
21+
type A = Get<Data, 'hello'>; // 'world'
22+
type B = Get<Data, 'foo.bar.count'>; // 6
23+
type C = Get<Data, 'foo.bar'>; // { value: 'foobar', count: 6 }

‎src/type-challenge/hard/IsAny.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,36 @@ type S11 = IsAny<[]>;
2929

3030
type ST = S1;
3131
type SF = S2 | S3 | S4 | S5 | S6 | S7 | S8 | S9 | S10 | S11;
32+
33+
enum Human {
34+
Man = 1,
35+
Woman = 'woman',
36+
}
37+
38+
const earth = {
39+
people: 'woman',
40+
} as const;
41+
42+
console.log(earth.people === Human.Woman);
43+
const isWoman = (person: Human.Woman) => person === Human.Woman;
44+
45+
const wn = 'woman' as Human.Woman;
46+
isWoman(wn);
47+
48+
enum ButtonSize {
49+
BG = 'bg',
50+
SM = 'sm',
51+
}
52+
interface ButtonProps {
53+
size: ButtonSize;
54+
}
55+
56+
function Button(props: ButtonProps) {
57+
if (props.size === ButtonSize.BG) {
58+
return 'big button';
59+
} else {
60+
return 'smaill button';
61+
}
62+
}
63+
64+
Button({ size: 'sm' as ButtonSize });
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
export type StringToTuple<T extends string> = T extends `${infer F}${infer R}`
2+
? [F, ...StringToTuple<R>]
3+
: [];
4+
5+
export type IsPalindromeTuple<T extends any[]> = T extends [
6+
infer F,
7+
...infer M,
8+
infer E
9+
]
10+
? F extends E
11+
? IsPalindromeTuple<M>
12+
: false
13+
: true;
14+
15+
export type IsPalindrome<T> = T extends string | number
16+
? IsPalindromeTuple<StringToTuple<`${T}`>>
17+
: false;
18+
19+
type _test1 = IsPalindrome<'abc'>; // false
20+
type _test2 = IsPalindrome<12>; // true

‎src/type-challenge/hard/Overwrite.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
type TEST1 = { a: number; b: string }['a' | 'b'];
2+
3+
export type Diff<T extends keyof any, U extends keyof any> = ({
4+
[K in T]: K;
5+
} & { [K in U]: never } & { [propName: string]: never })[T];
6+
7+
export type Overwrite<T, U> = Pick<T, Diff<keyof T, keyof U>> & U;
8+
9+
type Overwrited = Overwrite<{ a: 1 }, { a: 2 }>;
10+
const a: Overwrited = { a: 2 };
11+
12+
// Promise<Promise<T>>.then(v => type v is Promise<T>).
13+
declare function asc<T>(): Promise<Promise<T>>;
14+
asc<number>().then((v) => {
15+
type v is Promsie<number>;
16+
});

‎src/type-challenge/hard/Set.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
export type Set<
2+
T,
3+
Path extends string,
4+
U
5+
> = Path extends `${infer K}.${infer R}`
6+
? K extends keyof T
7+
? {
8+
[P in keyof T]: P extends K ? Set<T[P], R, U> : T[P];
9+
}
10+
: never
11+
: Path extends keyof T
12+
? { [K in keyof T]: K extends Path ? U : T[K] }
13+
: never;
14+
15+
type C = Set<{ foo: { bar: { zcc: number } } }, 'foo.bar.zcc', string>;
16+
// -> {foo: {bar: {zcc: string}}}

‎src/type-challenge/middle/Chunk.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
export type Chunk<T extends number[], S extends number> = S extends 0
2+
? []
3+
: Helper<T, S>;
4+
5+
type Helper<
6+
T extends number[],
7+
S extends number,
8+
C extends number[] = []
9+
> = T extends [infer H, ...infer R]
10+
? C['length'] extends S
11+
? [C, ...Helper<T, S, []>]
12+
: R extends number[]
13+
? H extends number
14+
? Helper<R, S, [...C, H]>
15+
: never
16+
: [...C, H]
17+
: [C];
18+
19+
// type T1<T extends number[]> = T extends [infer H, ...infer _]
20+
// ? OnlyNum<H>
21+
// : false;
22+
// type OnlyNum<T extends number> = T;
23+
// type T1_T1 = T1<[1]>;
24+
// Do you know lodash? Chunk is a very useful function in it, now let's implement it. Chunk<T, N> accepts two required type parameters, the T must be a tuple, and the N must be an integer >=1
25+
26+
type exp1 = Chunk<[1, 2, 3], 2>; // expected to be [[1, 2], [3]]
27+
type exp2 = Chunk<[1, 2, 3], 4>; // expected to be [[1, 2, 3]]
28+
type exp3 = Chunk<[1, 2, 3], 1>; // expected to be [[1], [2], [3]]
29+
type exp4 = Chunk<[], 1>; // expected to be [[]]
30+
type exp5 = Chunk<[1, 2, 3], 0>; // expected to be []

‎src/type-challenge/middle/FIil.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// import { GreaterThan } from './Greater';
2+
3+
type Fill<
4+
T,
5+
I,
6+
S extends number = 0,
7+
E extends number = 0,
8+
_C extends number[] = [],
9+
_D extends number[] = []
10+
> = GreaterThan<S, E> extends false ? _C['length'] S : T;
11+
12+
type MAKE<
13+
T extends any,
14+
N extends number,
15+
_R extends T[] = []
16+
> = _R['length'] extends N ? _R : MAKE<T, N, [..._R, T]>;
17+
18+
type T1 = MAKE<1, 0>;

‎src/type-challenge/middle/Greater.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
export type GreaterThan<
2+
A extends number,
3+
B extends number,
4+
_A extends number[] = [],
5+
_B extends number[] = []
6+
> = _A['length'] extends A
7+
? false
8+
: _B['length'] extends B
9+
? true
10+
: GreaterThan<A, B, [..._A, 1], [..._B, 1]>;
11+
12+
type T1 = GreaterThan<2, 1>; //should be true
13+
type T2 = GreaterThan<1, 1>; //should be false
14+
type T3 = GreaterThan<3, 2>; //should be true
15+
type T4 = GreaterThan<1, 3>; //should be false

‎src/type-challenge/middle/IsTunple.ts

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
// !DONE
2+
export type IsTuple<T> = T extends readonly any[]
3+
? number extends T['length']
4+
? false
5+
: true
6+
: false;
7+
8+
type case1 = IsTuple<[number]>; // true
9+
type case2 = IsTuple<readonly [number]>; // true
10+
type case3 = IsTuple<number[]>; // false
11+
12+
type T1 = readonly [number, string];
13+
type A1 = number[];
14+
15+
type T1_T1 = T1['length'];
16+
17+
type A1_T1 = A1['length'];
18+
19+
type T1_T2 = T1 extends (infer I)[] ? (T1 extends I[] ? true : false) : never;
20+
21+
type T1_T3 = T1 extends any[] ? true : false;
22+
23+
type N1_T1 = number extends 1 ? true : false;
24+
25+
type N1_T3 = number extends number ? true : false;
26+
27+
type A1_T2 = readonly any[] extends any[] ? true : false;
28+
type A1_T3 = any[] extends readonly any[] ? true : false;
29+
type a = { readonly a: 1 };
30+
31+
type ra = { a: 1 } extends a ? true : false;
32+
33+
interface Foo {
34+
readonly a: number;
35+
}
36+
37+
class Bar {
38+
a: number = 0;
39+
}
40+
41+
type TT = { readonly a: 1 } extends Foo ? true : false;
42+
43+
let a: readonly number[] = [1, 2, 3];
44+
// a.push(1);
45+
// a[0] = 2;

‎src/type-challenge/middle/Make.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
export type Make<
2+
T extends any,
3+
N extends number,
4+
_R extends T[] = []
5+
> = _R['length'] extends N ? _R : MAKE<T, N, [..._R, T]>;
6+
7+
type T1 = MAKE<1, 0>;
8+
type T2 = MAKE<1, 10>;

0 commit comments

Comments
 (0)