Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript-类似Kotlin的复制函数_Typescript - Fatal编程技术网

Typescript-类似Kotlin的复制函数

Typescript-类似Kotlin的复制函数,typescript,Typescript,在Kotlin中,可以使用其自动生成的copy功能复制数据类 val jack = User(name = "Jack", age = 1) val olderJack = jack.copy(age = 2) 根据文档(),复制函数签名: 这样的事情可以在TypeScript中完成吗? 这是一个可以接受的解决方案,还是可以改进 export class User { constructor( public name: string, p

在Kotlin中,可以使用其自动生成的
copy
功能复制
数据类

val jack = User(name = "Jack", age = 1)
val olderJack = jack.copy(age = 2)
根据文档(),复制函数签名:

这样的事情可以在TypeScript中完成吗?
这是一个可以接受的解决方案,还是可以改进

export class User {
    constructor(
            public name: string,
            public age: number) {}

    copy(parameters: {
        name?: string,
        age?: number
    }): User {
        const { name, age } = parameters
        return new User(name || this.name, age || this.age)
    }
}
即使使用
部分
,也可以解决此问题:

copy(partialUser:Partial):用户{
返回新用户(
partialUser.name | | this.name,
partialUser.age | | this.age)
}

您可以按如下所示解构项目:

class User {
    constructor(
            public name: string,
            public age: number) {}
}

const jack = new User("Jack", 1);

const newJack = { ...jack, age: 2 };
这会产生副本,但年龄除外,现在是
2

排序很重要(即年龄必须遵循对象解构)

扩展示例如下:

class User {
    constructor(
        public name: string,
        public age: number) { }

    copy(user: Pick<User, 'name' | 'age'>) {
        return new User(user.name, user.age);
    }
}

const jack = new User("Jack", 1);

const newJack = jack.copy({ ...jack, age: 2 });

console.log(newJack);
类用户{
建造师(
公共名称:string,
公众年龄:人数{}
复制(用户:选择){
返回新用户(User.name、User.age);
}
}
const jack=新用户(“jack”,1);
const newJack=jack.copy({…jack,年龄:2});
控制台日志(newJack);

您可以按如下所示解构项目:

class User {
    constructor(
            public name: string,
            public age: number) {}
}

const jack = new User("Jack", 1);

const newJack = { ...jack, age: 2 };
这会产生副本,但年龄除外,现在是
2

排序很重要(即年龄必须遵循对象解构)

扩展示例如下:

class User {
    constructor(
        public name: string,
        public age: number) { }

    copy(user: Pick<User, 'name' | 'age'>) {
        return new User(user.name, user.age);
    }
}

const jack = new User("Jack", 1);

const newJack = jack.copy({ ...jack, age: 2 });

console.log(newJack);
类用户{
建造师(
公共名称:string,
公众年龄:人数{}
复制(用户:选择){
返回新用户(User.name、User.age);
}
}
const jack=新用户(“jack”,1);
const newJack=jack.copy({…jack,年龄:2});
控制台日志(newJack);

我不会丢失最终的实例/静态函数吗?我添加了一个更广泛的示例,其中
newJack
是完整的
用户
。谢谢!你觉得
Pick
Partial
更合适吗?
Pick
你说“它必须有我声明的成员”,而
Partial
说“我不知道它会有什么”。在我们的情况下,我们可以非常严格地要求提供姓名和年龄,而不关心
副本。因此,在我们的
Pick
示例中将以下内容捕获为错误:
const newJack=jack.copy({age:2})有趣!我甚至可以使用
(user:Pick):user{…}
。你认为我的
部分
示例不合适吗?我这样问是为了让我能够理解我通常做的是对的还是错的。我会失去最终的实例/静态函数吗?我添加了一个更广泛的示例,其中
newJack
是完整的
用户。谢谢!你觉得
Pick
Partial
更合适吗?
Pick
你说“它必须有我声明的成员”,而
Partial
说“我不知道它会有什么”。在我们的情况下,我们可以非常严格地要求提供姓名和年龄,而不关心
副本。因此,在我们的
Pick
示例中将以下内容捕获为错误:
const newJack=jack.copy({age:2})有趣!我甚至可以使用
(user:Pick):user{…}
。你认为我的
部分
示例不合适吗?我这样问是为了让我能够理解我做的总体上是对还是错