# Typescript: types errors

**URL:** <https://community.forestadmin.com/t/typescript-types-errors/3370>\
**Category:** Help me!\
**Tags:** typescript\
**Created:** [September 29, 2021, 4:28pm UTC](https://community.forestadmin.com/t/typescript-types-errors/3370 "2021-09-29T16:28:34Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![Quentin\_Giraud](https://dub1.discourse-cdn.com/flex013/user_avatar/community.forestadmin.com/quentin_giraud/32/2079_2.png) [@Quentin\_Giraud](https://community.forestadmin.com/u/Quentin_Giraud)\
**Post date:** [September 29, 2021, 4:28pm UTC](https://community.forestadmin.com/t/typescript-types-errors/3370/1 "2021-09-29T16:28:34Z")

</div>

Hello,

I was trying to use Forest types in our project but have some troubles to use it

## Expected behavior

Having no error when trying to used Forest types in our collections

## Actual behavior

```javascript
collection("CardSettings", {
  fields: [
    {
      field: "id",
      type: "String" as FieldType,
      isSortable: true,
      isFilterable: true,
    },
    ...
  ],
});

```

And the second one :

```javascript
collection("Account", {
  fields: [
    {
      field: "holderType",
      type: "Enum" as FieldType,
      enums: [...identityTypeEnum],
    },
    {
      field: "holderName",
      type: "String" as FieldType,
      isFilterable: true,
      filter: ({ condition }) => filterOnHolderName(condition),
      search: (query, search) => searchOnHolderName(query, search),
    },
  ],
});

```

## Failure Logs

`'isSortable' does not exist in type 'SmartFieldOptions'`

`Type 'Promise<{ id: string[]; }>' is not assignable to type 'WhereOptions'` on `filter` field

## Context

- Package Version: 8.2.8
- Express Version: 4.17.1
- Sequelize Version: 5.22.3
- Database Dialect: postgresql
- Database Version:
- Project Name: Swan Back-Office

Thanks

---

<div class="post-metadata">

**Author:** ![anon36130554](https://avatars.discourse-cdn.com/v4/letter/a/b3f665/32.png) [@anon36130554](https://community.forestadmin.com/u/anon36130554)\
**Post date:** [September 30, 2021, 1:46pm UTC](https://community.forestadmin.com/t/typescript-types-errors/3370/2 "2021-09-30T13:46:50Z")

</div>

Helo @Quentin_Giraud 👋

Thanks for opening a thread in the community 🙌

Indeed, the `isSortable` option is not available for smart fields, so no errors to me so far, please see the related section in the [documentation](https://docs.forestadmin.com/documentation/reference-guide/fields/create-and-manage-smart-fields#sorting).

Regarding the second issue related to your filter implementation, may I see the definition of the function `filterOnHolderName(condition)` please ? Do note that the filter attribute on a smart field should contain a function returning an Sequelize Filter. In your case it looks like `filterOnHolderName` returns a promise: `Promise<{ id: string[]; }>`

Awaiting your answer,

Steve.

---

<div class="post-metadata">

**Author:** ![Quentin\_Giraud](https://dub1.discourse-cdn.com/flex013/user_avatar/community.forestadmin.com/quentin_giraud/32/2079_2.png) [@Quentin\_Giraud](https://community.forestadmin.com/u/Quentin_Giraud)\
**Post date:** [September 30, 2021, 3:00pm UTC](https://community.forestadmin.com/t/typescript-types-errors/3370/3 "2021-09-30T15:00:33Z")

</div>

Thanks for your answer 🙏🏻

For the `isSortable`, `CardSettings ` is a smart collection, the sort is doing in our graphql call to an other service, so it is necessary for us

About the `holderName` field, here the function :

```javascript
const filterOnHolderName = async (context: {
  condition: { value: string; operator: ForestOperator };
}) => {
  const parser = new FilterParser({ fields: [] }, "Europe/Paris");
  const splittedName = context.condition.value.split(" ");
  const firstName = splittedName[0];
  const lastName = splittedName[1];

  const [filterCompanyName, filterFirstName, filterLastName] = await Promise.all([
    parser.formatCondition({
      field: "name",
      operator: context.condition.operator,
      value: context.condition.value,
    }),
    parser.formatCondition({
      field: "firstName",
      operator: context.condition.operator,
      value: firstName,
    }),
    parser.formatCondition({
      field: "lastName",
      operator: context.condition.operator,
      value: lastName,
    }),
  ]);

  const where = {
    [Op.or]: {
      ...filterCompanyName,
      ...filterFirstName,
      ...filterLastName,
    },
  };

  const accounts = await AccountModel.findAll({
    attributes: ["id"],
    include: [
      {
        required: true,
        attributes: [],
        model: AccountHolder,
        where,
      },
    ],
  });
  return { id: accounts.map(account => account.id) };
};

```

It returns a Promise yes, but, actually, it does work like this on our back-office

---

<div class="post-metadata">

**Author:** ![Quentin\_Giraud](https://dub1.discourse-cdn.com/flex013/user_avatar/community.forestadmin.com/quentin_giraud/32/2079_2.png) [@Quentin\_Giraud](https://community.forestadmin.com/u/Quentin_Giraud)\
**Post date:** [October 4, 2021, 11:51am UTC](https://community.forestadmin.com/t/typescript-types-errors/3370/4 "2021-10-04T11:51:36Z")

</div>

If you have any alternatives on those 2 points I would be interested

---

<div class="post-metadata">

**Author:** ![Quentin\_Giraud](https://dub1.discourse-cdn.com/flex013/user_avatar/community.forestadmin.com/quentin_giraud/32/2079_2.png) [@Quentin\_Giraud](https://community.forestadmin.com/u/Quentin_Giraud)\
**Post date:** [October 4, 2021, 3:05pm UTC](https://community.forestadmin.com/t/typescript-types-errors/3370/5 "2021-10-04T15:05:28Z")

</div>

An other issue on smart actions load hook :

As indicates here : [Upgrade to v8 - Documentation](https://docs.forestadmin.com/documentation/how-tos/maintain/upgrade-notes-sql-mongodb/upgrade-to-v8) I have the following code

```javascript
hooks: {
  load: async ({ fields, request }) => {
    const [id] = await new RecordsGetter(model, request.user, request.query)
      .getIdsFromRequest(request);
    // or
    const id = request.body.data.attributes.ids[0];
      
    const record = await model.findByPk(id);

    const field = fields.find(field => field.field === 'a field');
    field.value = record.aProps;

    return fields;
  },
}

```

But the return type of `SmartActionLoadHook` is `SmartActionLoadHookField[]`, so I have one more issue because it does not accept `Promise<SmartActionLoadHookField[]`
