返回

TypeScript 挑战题:逐步理解 TypeScript 的深奥之处

前端

TypeScript 作为一门流行的编程语言,以其强大的类型系统和对 JavaScript 的扩展而著称。想要深入掌握 TypeScript,除了学习理论知识,还需要通过实践来巩固理解并发现知识的盲点。挑战题是检验知识的有效方式之一,它可以帮助我们发现自己对语言的理解程度,并促使我们不断学习和进步。

本篇文章提供了丰富的 TypeScript 挑战题,涵盖了数组、函数、对象、泛型和类型推断等方面的题目,旨在帮助 TypeScript 开发人员在实践中加深对语言的理解和掌握。这些题目难度适中,适合不同阶段的 TypeScript 学习者。

数组

  1. 实现一个函数,接收一个数组和一个值,返回一个新数组,其中包含该值在原数组中首次出现的索引。如果该值不在数组中,则返回 -1。
function findIndexOfValue(array: any[], value: any): number {
  for (let i = 0; i < array.length; i++) {
    if (array[i] === value) {
      return i;
    }
  }
  return -1;
}
  1. 实现一个函数,接收一个数组和一个值,返回一个新数组,其中包含该值在原数组中最后一次出现的索引。如果该值不在数组中,则返回 -1。
function findLastIndexOfValue(array: any[], value: any): number {
  for (let i = array.length - 1; i >= 0; i--) {
    if (array[i] === value) {
      return i;
    }
  }
  return -1;
}
  1. 实现一个函数,接收一个数组,返回一个新数组,其中包含数组中所有唯一的值。
function findUniqueValues(array: any[]): any[] {
  const uniqueValues = [];
  for (let i = 0; i < array.length; i++) {
    if (uniqueValues.indexOf(array[i]) === -1) {
      uniqueValues.push(array[i]);
    }
  }
  return uniqueValues;
}

函数

  1. 实现一个函数,接收两个函数作为参数,返回一个新函数,该新函数依次调用这两个函数,并返回第二个函数的返回值。
function composeFunctions(fn1: Function, fn2: Function): Function {
  return function (...args: any[]) {
    return fn2(fn1(...args));
  };
}
  1. 实现一个函数,接收一个函数和一个值作为参数,返回一个新函数,该新函数每次调用时都会将该值作为第一个参数传递给原函数。
function curryFunction(fn: Function, value: any): Function {
  return function (...args: any[]) {
    return fn(value, ...args);
  };
}
  1. 实现一个函数,接收一个函数作为参数,返回一个新函数,该新函数每次调用时都会将当前的执行上下文(this)作为第一个参数传递给原函数。
function bindFunction(fn: Function, context: any): Function {
  return function (...args: any[]) {
    return fn.apply(context, args);
  };
}

对象

  1. 实现一个函数,接收一个对象和一个键作为参数,返回该对象中与该键对应的值。如果该键不存在,则返回 undefined。
function findValueForKey(object: any, key: string): any {
  if (object.hasOwnProperty(key)) {
    return object[key];
  }
  return undefined;
}
  1. 实现一个函数,接收一个对象和一个新键值对作为参数,返回一个新对象,该新对象包含原对象的所有键值对以及该新键值对。
function addKeyValueToObject(object: any, key: string, value: any): any {
  const newObject = Object.assign({}, object);
  newObject[key] = value;
  return newObject;
}
  1. 实现一个函数,接收一个对象和一个键作为参数,返回一个新对象,该新对象包含原对象的所有键值对,除了该键及其对应的值。
function removeKeyFromObject(object: any, key: string): any {
  const newObject = Object.assign({}, object);
  delete newObject[key];
  return newObject;
}

泛型

  1. 实现一个函数,接收一个数组和一个类型作为参数,返回一个新数组,其中包含原数组中所有符合该类型的元素。
function filterArrayByType(array: any[], type: Function): any[] {
  const filteredArray = [];
  for (let i = 0; i < array.length; i++) {
    if (typeof array[i] === type) {
      filteredArray.push(array[i]);
    }
  }
  return filteredArray;
}
  1. 实现一个函数,接收一个数组和一个函数作为参数,返回一个新数组,其中包含原数组中所有符合该函数条件的元素。
function filterArrayByCondition(array: any[], condition: Function): any[] {
  const filteredArray = [];
  for (let i = 0; i < array.length; i++) {
    if (condition(array[i])) {
      filteredArray.push(array[i]);
    }
  }
  return filteredArray;
}
  1. 实现一个函数,接收一个数组和一个类型作为参数,返回一个新数组,其中包含原数组中所有不属于该类型的元素。
function rejectArrayByType(array: any[], type: Function): any[] {
  const rejectedArray = [];
  for (let i = 0; i < array.length; i++) {
    if (typeof array[i] !== type) {
      rejectedArray.push(array[i]);
    }
  }
  return rejectedArray;
}

类型推断

  1. 实现一个函数,接收一个值作为参数,返回该值的类型。
function findTypeOfValue(value: any): string {
  return typeof value;
}
  1. 实现一个函数,接收一个值作为参数,返回该值所属的内置类型。
function findBuiltInTypeOfValue(value: any): string {
  return Object.prototype.toString.call(value).slice(8, -1);
}
  1. 实现一个函数,接收一个值作为参数,返回该值所属的自定义类型。
function findCustomTypeOfValue(value: any): string {
  if (value.constructor && value.constructor.name) {
    return value.constructor.name;
  }
  return "Unknown";
}

我们希望这些挑战题能够帮助读者更好地掌握 TypeScript 的核心概念和技巧。通过解决这些题目,读者可以发现自己的知识盲点,并促使自己不断学习和进步。我们还提供了题库链接,供读者获取更多挑战题,持续精进 TypeScript 技术。