Я читаю репозиторий @types/node
и нахожу такие вещи:
declare module 'https' {
import * as tls from 'node:tls';
import * as http from 'node:http';
interface Server extends http.Server {}
class Server extends tls.Server {
constructor(requestListener?: http.RequestListener);
constructor(options: ServerOptions, requestListener?: http.RequestListener);
addListener(event: string, listener: (...args: any[]) => void): this;
// ...
}
}
Или это:
declare module 'url' {
// ...
interface Url {
auth: string | null;
hash: string | null;
host: string | null;
hostname: string | null;
href: string;
path: string | null;
pathname: string | null;
protocol: string | null;
search: string | null;
slashes: boolean | null;
port: string | null;
query: string | null | ParsedUrlQuery;
}
class URL {
static createObjectURL(blob: Blob): string;
static revokeObjectURL(objectUrl: string): void;
constructor(input: string, base?: string | URL);
hash: string;
host: string;
hostname: string;
// ...
}
// ...
}
Или:
declare module 'fs' {
export interface Stats extends StatsBase<number> {}
export class Stats {}
}
Что это значит, когда вы определяете и class
, и interface
в одном и том же файле/пространстве имен? Когда URL
относится к классу, когда к интерфейсу и т. д.? Это стандартная практика? Каковы различия/сходства между интерфейсом и классом в этом контексте, как они соотносятся?
Оп, понял спасибо.
Классы и интерфейсы подлежат слиянию, если они имеют одинаковое имя. Вы можете проконсультироваться с документы о том, какое слияние разрешено. Слияние интерфейса класса приведет к типу экземпляра для класса, в котором члены интерфейса добавлены к типу экземпляра класса.
interface PersonInterfaceBase {
fromBaseInterface: number;
}
interface Person extends PersonInterfaceBase {
fromInterface: string
}
class Person {
fromClass: string = ""
}
let p = new Person();
// All are valid
p.fromBaseInterface
p.fromClass
p.fromInterface
Использование слияния позволяет избежать повторного объявления членов интерфейса в классе (но также позволяет избежать их определения в классе и проверки их инициализации).
В случае Url
и URL
это две разные сущности и не имеют никакого отношения.
Есть идеи, что Зачем можно было бы написать отдельно? В частности, пример Node.js https
кажется действительно странным.
@T.J.Crowder и http.Server
, и `tls.Server` являются классами, поэтому вы не можете наследовать их оба. Если бы он сказал implements http.Server
, ему пришлось бы повторно объявить всех членов http.Server
в Server
, так что это просто способ избежать этого.
Итак, в основном, форсируя немного множественного наследования (на уровне типа). :-)
Примечание:
Url
иURL
— разные идентификаторы. Вашdeclare module 'url'
пример не стыкуется с другими.