typescript: Как написать функцию со стрелкой с объявлением типа?

#typescript

Вопрос:

Я пытаюсь выполнить эквивалент следующего кода JavaScript в typescript:

   users.map( item => (
    { name: item.name,
      email: item.email,
      ...item.user
    }
  ));

 

Итак, users это похоже на:

 users = [
  {
    name: "John",
    email: "john@msn"
    user: {
            age: 56,
            gender: "Male", 
            address: "...", 
            sport: "basketball"
          }
  }, 
  ...
  
]

 

Я пытаюсь преобразовать его в:

 users = [
  {
    name: "John",
    email: "john@msn",
    age: 56,
    gender: "Male", 
    address: "...", 
    sport: "basketball"
  }, 

  ...
  
]

 

Я думал, что должен был объявить тип параметра непосредственно после параметра и тип возвращаемого значения перед стрелкой:

   users.map( (item:object):object => (
    { name: item.name,
      email: item.email,
      ...item.user
    }
  ));

 

Но это не работает.

Есть какие-нибудь намеки?

Ответ №1:

Вы можете использовать map в typescript без какого-либо типа, как в JavaScript, но если вы хотите использовать тип, вам нужно создать интерфейс. Обратите внимание , что объект не имеет свойства name email и других свойств, поэтому при использовании объекта ts компилятор выдает ошибку:

Попробуйте вот это:

 interface personlaInfo{
age: number,
gender: string, 
address: string, 
sport: string
}

interface user{
  name:string,
  email: string
  personlaInfo:personlaInfo;
}

var users : Array<user> = [
  {
    name: "John",
    email: "john@msn",
    personlaInfo: {
            age: 56,
            gender: "Male", 
            address: "...", 
            sport: "basketball"
          }
  }  
]

 var f = users.map( (item:user) => (
    { name: item.name,
      email: item.email,
      ...item.personlaInfo
    }
  ));
 

Ссылка на игровую площадку

Ответ №2:

Вам не нужно второе object , в этом случае TypeScript может сделать вывод, например, так:

   users.map((item:object) => (
    { name: item.name,
      email: item.email,
      ...item.user
    }
  ));
 

Ответ №3:

Вам нужно определить интерфейсы для вашего типа данных и использовать их на карте, как показано ниже:

 interface MyUser {
    name: string;
    email: string;
    age: number;
    gender: string;
    address: string;
    sport: string;
}

interface UserInfo {
    age: number;
    gender: string;
    address: string;
    sport: string;
}


interface User {
    name: string;
    email: string;
    user: UserInfo
}


const users:Array<User> = [
    {
      name: "John",
      email: "john@msn",
      user: {
              age: 56,
              gender: "Male", 
              address: "...", 
              sport: "basketball"
            }
    }, 
    {
        name: "John1",
        email: "john1@msn",
        user: {
                age: 26,
                gender: "Male", 
                address: "...", 
                sport: "basketball"
              }
      }, 
  ];

const my_users = users.map( (item:User):MyUser => (
    { name: item.name,
      email: item.email,
      ...item.user
    }
  ));

  console.log(my_users)