代码之家  ›  专栏  ›  技术社区  ›  anon

TypeScript的Array.map与destructuring的等价关系是什么?

  •  0
  • anon  · 技术社区  · 7 年前

    interface Person {
      name: string;
      address: string;
    }
    
    function getName({ name }: Person): Partial<Person> {
      return ({ name });
    }
    
    const people: Person[] = [
      {
        name: "Sally",
        address: "1234 E Test St."
      },
      // ...
    ];
    
    const names = people.map(getName);
    // => [{ "name": "Sally" }, ...]
    

    map filter_map ?

    1 回复  |  直到 7 年前
        1
  •  6
  •   Shepmaster Tim Diekmann    7 年前

    铁锈也会通过 pattern matching

    struct Person {
        name: String,
        address: String,
    }
    
    fn get_name(Person { name, .. }: Person) -> String {
        name
    }
    
    fn main() {
        let people = vec![Person {
            name: String::from("Sally"),
            address: String::from("1234 E Test St."),
        }];
    
        let names: Vec<_> = people.into_iter().map(get_name).collect();
        println!("{:?}", names);
    }
    

    然而,你通常不会看到人们在函数签名中进行这种类型的分解。它在自动生成的文档中公开了更多的实现。更常见的是在函数内部立即看到它:

    fn get_name(person: Person) -> String {
        let Person { name, .. } = person;
        name
    }
    

    而且人们不经常在 let

    fn get_name(person: Person) -> String {
        person.name
    }
    

    这个特殊的函数不是

    .map(|p| p.name)
    

    你原来的打字稿中有很多东西不能直接翻译成锈迹:

    1. 概念 Partial
    2. 锈菌载体本身不能实现 map 以及那些行动所属的朋友 iterators 懒惰的 ,这使得生锈比相应的JS更有效。

    如果我想破坏一个以上的财产呢?

    如果需要匿名字段集合,通常使用 元组

    fn get_name_things(Person { name, .. }: Person) -> (String, usize) {
        (name, 42)
    }
    

    推荐文章