Стек: ReactJS 16.x, Typescript 2.8.1, проект создания-реагирования-приложения.
Я получаю ошибку типа при использовании оператора распространения для передачи props
из класса TypeScript в компонент React.
Ошибка возникает только тогда, когда в классе определена функция. Если у класса есть переменная выражения функции, оператор распространения работает нормально. Я считаю, что это связано с перечислением свойств в классе. Итак, я использую декоратор, чтобы пометить функцию как не перечисляемую, но все еще получаю ту же ошибку. Ниже приведен код:
Message
- это класс, который я пытаюсь распространить в React Component.
export class Message {
constructor() {
this.init2 = (msg: string) => {
this.msg = 'init2';
return this;
}
}
public msg: string;
// This works with spread operator
public init2: (msg: string) => Message;
// This will cause the spread operator to fail
public init(msg: string): Message {
this.msg = msg;
return this;
}
// Even with decorator to turn off enumeration, spread operator fails
@enumerable(false)
public initNoEnum(msg: string): Message {
this.msg = msg;
return this;
}
}
Компонент ReactJS, чья опора определяется как Message
:
export class MessageComponent extends React.Component<Message, any>{
render() {
return (<div>{this.props.msg}</div>);
}
}
Метод визуализации, который использует MessageComponent
:
public render() {
const msg = new Message().init('hello world!');
return <MessageComponent {...msg} /> // The spread here fails
}
Функция декоратора enumerable
:
export function enumerable(value: boolean): any {
return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
descriptor.enumerable = value;
};
}
TSconfig:
"compilerOptions": {
"outDir": "./build",
"module": "esnext",
"target": "es5",
"lib": [ "es6", "dom" ],
"sourceMap": true,
"allowJs": true,
"jsx": "react",
"moduleResolution": "node",
"rootDir": "src",
"forceConsistentCasingInFileNames": true,
"noImplicitReturns": true,
"noImplicitThis": true,
"noImplicitAny": true,
"strictNullChecks": true,
"suppressImplicitAnyIndexErrors": true,
"noUnusedLocals": true,
"experimentalDecorators": true
},
Если я закомментирую init
и initNoEnum
и оставлю init2
, оператор распространения работает. При init
и initNoEnum
оператор распространения не работает с аналогичным сообщением:
Тип '{msg: строка; init2: (msg: string) => Сообщение; } 'нельзя назначить типу IntrinsicAttributes & IntrinsicClassAttributes & Readonly <{children ?: ReactNod ...'. Тип '{msg: строка; init2: (msg: string) => Сообщение; } 'нельзя назначить типу «Только чтение». Свойство 'init' отсутствует в типе '{msg: string; init2: (msg: string) => Сообщение; }».
Что я делаю не так? Как сделать так, чтобы оператор распространения только перечислял через свойства, а не функции?