javascript - Konvertera FC till [ 'new() => any' ]
Jag försöker implementera ett anpassat filter för AgGridReact och jag försöker tilldela det till:
frameworkComponents: {
newcustomFilter: CustomFilter
},
Jag får ett fel:
Type '(props: any) => JSX.Element' is not assignable to type 'new () => any'.
Type '(props: any) => Element' provides no match for the signature 'new (): any'.ts(2322)
Hur konverterar jag min FC-komponent till new() => any?
Jag försökte skapa en React Function Component. Den implementerar alla metoder i gränssnittet IFilterComp. Nedan är utdraget på hur jag tilldelade till grid:columnDefs-egenskapen.
columnDefs: [
{
headerName: 'PRICE',
field: WATERFALL_COLUMN_IDS.PRICE,
colId: WATERFALL_COLUMN_IDS.PRICE,
minWidth: 70,
width: 92,
hide: false,
*filter: CustomFilter,*
filterParams: {
title: 'Year Filter',
values: [2000,2004,2006]
},
Men när jag tilldelar filteregenskapen misslyckas det.
Type '(props: any) => JSX.Element' is not assignable to type 'new () => any'.
Type '(props: any) => Element' provides no match for the signature 'new (): any'.ts(2322)
Kod för anpassat filter
import React from 'react'
import { useEffect, useState } from "react";
import { render } from "react-dom";
const customFilter = (props:any):any => {
const constructor = () => {
// your logic will go here ..
}
const [filterState, setFilterState] = useState('off');
useEffect( ()=> {
console.log(props.title + ' filter created');
return ()=> console.log(
props.title + ' filter destroyed');
}, []);
useEffect( ()=>
{
props.filterChangedCallback()
console.log('Hello World')
},
[filterState]);
const handleChange = (e:any) => {
console.log(e.target.value);
setFilterState(e.target.value)
}
const isFilterActive = () => {
return filterState!='off';
}
// @ts-ignore
const doesFilterPass = (params) => {
// @ts-ignore
const field = props.colDef.field;
return params.data[field] == filterState;
}
const getModel =() => {
if (filterState=='off') {
return undefined;
}
return {
state: filterState
}
}
// @ts-ignore
const setModel = (model) => {
console.log('Set Model is called')
if (model==null) {
setFilterState('off');
} else {
setFilterState(model.state);
}
}
const getModelAsString = () => {
return filterState=='off' ?
'' : filterState;
}
const onNewRowsLoaded = () => {
console.log('new rows were loaded');
}
const onAnyFilterChanged = () => {
console.log('another filter was changed');
}
const afterGuiAttached = () => {
console.log('focus something???');
}
return (
<div>
<div className='filter-title'>{props.title}</div>
<div className='filter-state'>
State = {filterState}
</div>
<div className='filter-entry'>
<button
onClick={()=>setFilterState('off')}>
Off
</button>
</div>
<select onChange={handleChange}>
{props.values.map((option:any) => (
<option key={option.value} value={option.value}>
{option.text}
</option>
))}
</select>
</div>
);
}
Svar #1
Försök att använda as-nyckelordet så här:
frameworkComponents: {
newcustomFilter: (CustomFilter as any)
},
om din linter inte är nöjd och verkligen vill ha en new() => any, ge den bara det den vill ha:
const customFilter = new (props: any) => {
