Это просто общий вопрос, который беспокоил меня какое-то время.
У меня есть компонент React, в котором есть как частные, так и общедоступные методы. Предположим, у меня есть компонент:
import React from 'react';
import { CRComponent } from '../CRComponent';
export interface Props {
className?: string;
type?: string;
}
class AlertItem extends CRComponent<Props> {
public render() {
return (
///// Some render
);
}
private getClassNames() {
///some logic
}
private mapAlertTypeIcon() {
///Some logic
}
}
export default AlertItem;
Когда я создаю файл определения машинописного текста, создается следующий файл:
import { CRComponent } from '../CRComponent';
interface Props {
className?: string;
}
declare class AlertItem extends CRComponent<Props> {
private getClassNames;
private mapAlertTypeIcon;
public render(): JSX.Element;
}
export default AlertItem;
Я намеренно удалил опору type из файла .d.ts, чтобы пользователь не мог использовать ее как внутреннюю.
Теперь, когда я публикую этот файл .d.ts, все методы членов публикуются в файле .d.ts, включая частные. Для этого класса методов относительно меньше. Предположим, у меня есть большой компонент, тогда количество частных методов может быть огромным.
Теперь в библиотеке компонентов таких компонентов будет много.
Когда я их публикую, основной размер пакета связан с этими файлами. Итак, мой вопрос в том, нужно ли сохранять закрытые члены в файлах .d.ts или я могу просто игнорировать их, поскольку у пользователя все равно не будет к ним доступа?
Я пытался найти ответы, но не нашел. Так что помощь будет оценена.





Частный метод меняет, можете ли вы создать замещаемый тип, например, объявление Example предотвращает совпадение типа с нашим конкретным классом (независимо от того, добавляем ли мы частный член идентификации!)
declare class Example {
private identity: string;
public doSomething(): string;
}
class ConcreteExample {
private identity: string = 'id';
doSomething() {
return 'done';
}
}
function passMeExample(input: Example) {
}
// ConcreteExample is not allowable!
passMeExample(new ConcreteExample());
Если вы удалите частные члены, это изменит поведение проверки типа:
declare class Example {
public doSomething(): string;
}
class ConcreteExample {
private identity: string = 'id';
doSomething() {
return 'done';
}
}
function passMeExample(input: Example) {
}
// OK!
passMeExample(new ConcreteExample());
Поэтому важно иметь в виду, что при удалении этих закрытых членов поведение будет отличаться. Классы не будут действовать так, как если бы они были включены.
TypeScript является структурно типизированным, а не номинально типизированным, но вы обнаружите, что структуры не совпадают, если частный член добавлен к целевому типу (это не проблема, если частный член добавлен к предоставленному типу).
Это потому, что ConcreteExample не имеет идентичного имени Example?