TypeScript 类型挑战 Medium

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TypeScript 类型挑战 Medium相关的知识,希望对你有一定的参考价值。

参考技术A

[[toc]]

Medium , #infer , #built-in

实现 TS 内置的 ReturnType<T> ,但不可以使用它。

答案

Medium , #union , #built-in

不使用 Omit 实现 TypeScript 的 Omit<T, K> 泛型。
Omit 会创建一个省略 K 中字段的 T 对象。

答案

Medium , #readonly , #object-keys

实现一个通用 MyReadonly2<T, K> ,它带有两种类型的参数 T 和 K 。

K 指定应设置为Readonly的 T 的属性集。如果未提供 K ,则应使所有属性都变为只读,就像普通的 Readonly<T> 一样。

答案

Medium , #readonly , #object-keys , #deep

实现一个通用的 DeepReadonly<T> ,它将对象的每个参数及其子对象递归地设为只读。

您可以假设在此挑战中我们仅处理对象。数组,函数,类等都无需考虑。但是,您仍然可以通过覆盖尽可能多的不同案例来挑战自己。

答案

Medium , #infer , #tuple , #union

实现泛型 TupleToUnion<T> ,它返回元组所有值的合集。

答案

Medium , #application

javascript 中我们很常会使用可串联(Chainable/Pipeline)的函数构造一个对象,但在 TypeScript 中,你能合理的给他附上类型吗?

在这个挑战中,你可以使用任意你喜欢的方式实现这个类型 - Interface, Type 或 Class 都行。你需要提供两个函数 option(key, value) 和 get() 。在 option 中你需要使用提供的 key 和 value 扩展当前的对象类型,通过 get 获取最终结果。

你只需要在类型层面实现这个功能 - 不需要实现任何 TS/JS 的实际逻辑。

你可以假设 key 只接受字符串而 value 接受任何类型,你只需要暴露它传递的类型而不需要进行任何处理。同样的 key 只会被使用一次。

答案

Medium , #array

实现一个通用 Last<T> ,它接受一个数组 T 并返回其最后一个元素的类型。

答案

Medium , #array

实现一个通用 Pop<T> ,它接受一个数组 T 并返回一个没有最后一个元素的数组。

额外 :同样,您也可以实现 Shift , Push 和 Unshift 吗?

答案

Medium , #array , #built-in

键入函数 PromiseAll ,它接受PromiseLike对象数组,返回值应为 Promise<T> ,其中 T 是解析的结果数组。

答案

Medium , #union , `#map

有时,您可能希望根据某个属性在联合类型中查找类型。

在此挑战中,我们想通过在联合类型 Cat | Dog 中搜索公共 type 字段来获取相应的类型。换句话说,在以下示例中,我们期望 LookUp<Dog | Cat, \'dog\'> 获得 Dog , LookUp<Dog | Cat, \'cat\'> 获得 Cat 。

答案

Medium , #template-literal

实现 TrimLeft<T> ,它接收确定的字符串类型并返回一个新的字符串,其中新返回的字符串删除了原字符串开头的空白字符串。

答案

Medium , #template-literal

实现 Trim<T> ,它是一个字符串类型,并返回一个新字符串,其中两端的空白符都已被删除。

答案

Medium , #template-literal

实现 Capitalize<T> 它将字符串的第一个字母转换为大写,其余字母保持原样。

答案

Medium , #template-iteral

实现 Replace<S, From, To> 将字符串 S 中的第一个子字符串 From 替换为 To 。

答案

Medium , #template-literal

实现 ReplaceAll<S, From, To> 将一个字符串 S 中的所有子字符串 From 替换为 To 。

答案

Medium , #arguments

实现一个泛型 AppendArgument<Fn, A> ,对于给定的函数类型 Fn ,以及一个任意类型 A ,返回一个新的函数 G 。 G 拥有 Fn 的所有参数并在末尾追加类型为 A 的参数。

答案

Medium , #union

实现联合类型的全排列,将联合类型转换成所有可能的全排列数组的联合类型。

答案

https://github.com/type-challenges/type-challenges/issues/614

Note

Medium , #template-literal

计算字符串的长度,类似于 String#length 。

答案

Medium , #array

在这个挑战中,你需要写一个接受数组的类型,并且返回扁平化的数组类型。

答案

Medium , #object-keys

实现一个为接口添加一个新字段的类型。该类型接收三个参数,返回带有新字段的接口类型。

答案

Medium , #math , #template-literal

实现一个接收string,number或bigInt类型参数的 Absolute 类型,返回一个正数字符串。

答案

Medium , #union , #string

实现一个将接收到的String参数转换为一个字母Union的类型。

答案

Medium , #object

实现联合类型的全排列,将联合类型转换成所有可能的全排列数组的联合类型。

答案

Medium , #

FooBarBaz -> foo-bar-baz

答案

Medium , #object

获取两个接口类型中的差值属性。

答案

Medium , #array

在类型系统中实现类似于 Python 中 any 函数。类型接收一个数组,如果数组中任一个元素为真,则返回 true ,否则返回 false 。如果数组为空,返回 false 。

答案

Medium , #union , #utils

实现 IsNever 类型, 解析输入 T 类型为 never 返回 true 否则 返回 false

答案

Medium , #union , #utils

实现 IsUnion 类型, 解析输入 T 类型为联合类型 返回 true 否则 返回 false

答案

Medium

实现 ReplaceKeys 类型, 它将替换联合类型中类型的键值, 如果该类型没有这个Key则跳过,如果有则替换。

答案

Medium

从对象类型中排除索引签名。

答案

https://github.com/type-challenges/type-challenges/issues/3542

Medium

实现类型 PercentageParser。根据规则 /^(\\+|\\-)?(\\d*)?(\\%)?$/ 匹配类型 T。

匹配的结果由三部分组成,分别是:[ 正负号 , 数字 , 单位 ],如果没有匹配,则默认是空字符串。

答案

Medium

从字符串中剔除指定字符。

答案

Medium , Math

给定一个正整数作为类型的参数,要求返回的类型是该数字减 1。

答案

Medium , object

从 F 中选出类型相同的属性

答案

Medium , #object

保留没有在U中指定的类型的字段

答案

Medium , #template-literal

实现 StartsWith<T, U> ,接收两个string类型参数,然后判断 T 是否以 U 开头,根据结果返回 true 或 false

答案

Medium , #object

实现一个通用的 PartialByKeys<T, K> ,它接收两个类型参数 T 和 K 。

K 指定应设置为可选的 T 的属性集。当没有提供 K 时,它就和普通的 Partial<T> 一样使所有属性都是可选的。

答案

Medium , #object

实现一个通用的 RequiredByKeys<T, K> ,它接收两个类型参数 T 和 K 。

K 指定应设为必选的 T 的属性集。当没有提供 K 时,它就和普通的 Required<T> 一样使所有的属性成为必选的。

答案

Medium , #readonly , object-keys

实现一个通用的类型 Mutable<T> ,使类型 T 的全部属性可变(非只读)。

答案

Medium , #object

1

答案

Medium

给定只包含字符串的元组,和类型U, 递归构建对象

答案

Medium , #tuple

实现类型版本的数组反转 Array.reverse

答案

Medium , #arguments

实现类型版本的 lodash _.flip 函数

类型 FlipArguments<T> 需要函数 T 并返回一个新的函数类型。这个函数类型拥有相同的参数,但参数类型是被反转的。

答案

Medium , #array

按深度递归展平阵列。

答案

Medium

块、元素、修饰符方法 (BEM) 是 CSS 中类的流行命名约定。例如,块组件将表示为 btn ,依赖于块的元素将表示为 btn__price ,改变块样式的修饰符将表示为 btn--big 或 btn__price--warning 。实现 BEM<B, E, M> 从这三个参数生成字符串联合。其中 B 是字符串文字,E 和 M 是字符串数组(可以为空)。

答案

Medium , #object

实现二叉树中序遍历的类型版本。

答案

Medium

实现类型 just-flip-object :

答案

Medium

实现泛型 Fibonacci<T> 传入数字 T 返回正确的 Fibonacci number .

1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...

答案

Medium

实现类型 AllCombinations<S> 返回所有字符组合.

答案

Medium , #array

实现类型 GreaterThan<T, U> 来比较大小,就像 T > U 。不需要考虑负数

1

答案

Medium , #tuple

实现 Zip<T, U> 类型。 T, U 必须为 Tuple

答案

Medium , #tuple

实现 IsTuple , 接收类型 T 判断 T 是否为元组类型

答案

Medium , #tuple

实现 Chunk<T, N> , 它有两个必填的类型参数, T 必须为 tuple , N 必须为大于1的数字

答案

Medium , tuple

Fill , 一个常用的 JavaScript 函数, 我们用类型实现它. Fill<T, N, Start?, End?> , 它接收4个类型参数, T , N 是必填参数 T 为元组, N 为 any, Start , End 是可选参数,为大于零的数子.

为了模拟真实的功能,测试中可能会包含一些边界条件,希望大家喜欢:)

答案

Medium

实现 TrimRight<T> 它采用精确的字符串类型并返回一个删除了空格结尾的新字符串。

答案

Medium , #union , #array

实现一个像 Lodash.without 函数一样的泛型 Without<T, U>,它接收数组类型的 T 和数字或数组类型的 U 为参数,会返回一个去除 U 中元素的数组 T。

答案

Medium , template-literal

实现类型版本的 Math.trunc . 它接受字符串或数字返回整数部分,提出小数部分

答案

Medium , #array

实现类型版本的 Array.indexOf<T, U> , 它接收数组T 和 U 返回U在T中的索引值

答案

Medium , #array

实现类型版 Array.join<T, U> 接收数组T和字符串或数字 U

答案

Medium , #array

实现类型版本的 Array.lastIndexOf<T, U> , 它接收数组T 和 U 返回U在T中的反向索引值

答案

Medium , #array

实现类型版本的 Lodash.uniq , 它接收数组T,返回去重后的T

答案

Medium

实现 MapTypes<T, R> 它将对象 T 中的类型转换为类型 R 定义的不同类型,类型 R 具有以下结构。

答案

Medium , #tuple

构造一个给定长度的元组

答案

Medium

有时我们想限制数字的范围......例如。

答案

Medium , #array , #application , #string

给定一个字符串数组,进行置换和组合。它对于像video controlsList这样的类型也很有用

答案

Medium , #union

给定一个唯一元素数组,返回所有可能的子序列。

子序列是一个序列,可以通过删除一些元素或不删除任何元素而从数组中派生,而不改变其余元素的顺序。

答案

typescript 测试具有依赖关系的管道。 https://medium.com/google-developer-experts/angular-2-testing-guide-a485b6cb

import { TestBed, inject } from '@angular/core/testing';

import { ConvertStatusPipe } from './convert-status.pipe';
import { ConversationStatus } from '@remedy/models';
import { LoggingService } from '../core/services/logging.service';
import { LoggingServiceMock } from './../core/services/logging.service.mock';

describe(`ConvertStatusPipe`, () => {
    let pipe;

    beforeEach(() => TestBed.configureTestingModule({
        providers: [
            ConvertStatusPipe,
            {
                provide: LoggingService,
                useClass: LoggingServiceMock,
            },
        ],
    }));

    beforeEach(inject([ConvertStatusPipe], p => {
        pipe = p;
    }));


    it(`transforms '0' to 'new'`, () => {
        const actual = pipe.transform(0, ConversationStatus);
        const expected = ConversationStatus[0];

        expect(actual).toBe(expected);
    });


    it(`should log an error if the output is incorrect`, () => {
        pipe.transform('closed');

        expect(pipe.loggingService.warn).toHaveBeenCalled();
    });

});

以上是关于TypeScript 类型挑战 Medium的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose 和 TypeScript - 类型“事件模型”上不存在属性“_doc”

淘宝:使用Node.js的TypeScript多场景框架和方案实践

为啥 sx 道具类型检查失败?

TypeScript系列教程16TypeScript 联合类型

TypeScript入门三:TypeScript函数类型

微软编程语言 TypeScript 2.0 发布