基于构造函数参数子集的类类型参数



我有一个类,它有一个类型参数,C:

import { EventEmitter } from "events";
interface ClientData {
a: string;
b?: string;
}
interface ClientOptions {
b?: string;
}
class Client<C extends ClientData> extends EventEmitter {
constructor(clientData: C) {
super();
console.log(clientData.a); // string
console.log(clientData.b); // string | undefined
}
}
const client = new Client({
a: "example",
b: "placeholder"
});
/**
* Client<{
*    a: string;
*    b: string;
*}>
*/
type ClientType = typeof client;

该类的构造函数接受ClientData类型的参数,其中输入的类型成为C类型参数。正如ClientType所看到的,这工作得很好。

但是,我需要C类型只包含ClientData属性的子集,在本例中为ClientOptions,并且它需要具有默认值{}:

class Client<C extends ClientOptions = {}> extends EventEmitter {
constructor(clientData: C) {
super();
console.log(clientData.a); // Property 'a' does not exist on type 'C'
console.log(clientData.b); // string | undefined
}
}

这里的问题是构造函数中的clientData参数将不再具有ClientDataa属性。既然构造函数不能有类型参数,我怎么能有clientData类型的ClientData,但也要确保C类型扩展ClientOptions与默认的{}?ClientOptions的所有属性都是可选的,并且存在于ClientData中。

通过使用Partial:

使属性可选
class Client<C extends Partial<ClientData>> extends EventEmitter {
constructor(clientData: C) {
super();
console.log(clientData.a); // string
console.log(clientData.b); // string | undefined
}
}

最新更新