Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

300 - String to Number #32618

Open
Vampirelee opened this issue Mar 18, 2024 · 0 comments
Open

300 - String to Number #32618

Vampirelee opened this issue Mar 18, 2024 · 0 comments
Labels
300 answer Share answers/solutions to a question en in English

Comments

@Vampirelee
Copy link

思路:

  1. 需要解析 0-9 的数字,定义联合类型 NumberUnion
S extends `${infer L extends NumberUnion}${infer Rest}` 
// 这样L便可以推断成数字了(0-9)。
  1. 需要实现加法 AddNumber, 利用数组实现
type AddNumber<N extends number, M extends number> = number extends N
  ? number extends M
    ? 0
    : 0
  : [...NumberToArr<N>, ...NumberToArr<M>]["length"] & number;
  1. 需要实现 乘10 MultiplyTen, 利用数组实现,写得比较死板
type MultiplyTen<N extends number> = number extends N
  ? 0
  : [
      ...NumberToArr<N>,
      ...NumberToArr<N>,
      ...NumberToArr<N>,
      ...NumberToArr<N>,
      ...NumberToArr<N>,
      ...NumberToArr<N>,
      ...NumberToArr<N>,
      ...NumberToArr<N>,
      ...NumberToArr<N>,
      ...NumberToArr<N>
    ]["length"] & number;
// 单个数字类型
type NumberUnion = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;
// 将数字转为相同大小的数组  NumberToArr<3>  // 结果是[1,1,1]
type NumberToArr<N extends number, Count extends 1[] = []> = Equal<
  N,
  Count["length"]
> extends true
  ? Count
  : NumberToArr<N, [...Count, 1]>;

// 将两个数字相加 AddNumber<1, 2> // 3
type AddNumber<N extends number, M extends number> = number extends N
  ? number extends M
    ? 0
    : 0
  : [...NumberToArr<N>, ...NumberToArr<M>]["length"] & number;

// 将某个数字乘10   MultiplyTen<10> // 100 
type MultiplyTen<N extends number> = number extends N
  ? 0
  : [
      ...NumberToArr<N>,
      ...NumberToArr<N>,
      ...NumberToArr<N>,
      ...NumberToArr<N>,
      ...NumberToArr<N>,
      ...NumberToArr<N>,
      ...NumberToArr<N>,
      ...NumberToArr<N>,
      ...NumberToArr<N>,
      ...NumberToArr<N>
    ]["length"] &
      number;

type ToNumber<
  S extends string,
  Res extends number = 0
> = S extends `${infer L extends NumberUnion}${infer Rest}`
  ? ToNumber<Rest, AddNumber<L, MultiplyTen<Res>>>
  : S extends ""
  ? Res
  : never;
@Vampirelee Vampirelee added answer Share answers/solutions to a question en in English labels Mar 18, 2024
@github-actions github-actions bot added the 300 label Mar 18, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
300 answer Share answers/solutions to a question en in English
Projects
None yet
Development

No branches or pull requests

1 participant