Интерфейс машинописного текста: не все составляющие строки типа | (() => string) 'вызываются. Тип 'строка' не имеет сигнатур вызовов - PullRequest
0 голосов
/ 09 июля 2020
interface ExampleType {
  [key: string]: string | (() => string);
}

const testObj: ExampleType = {
  firstName: "Peter",
  lastName: "Parker",
  gender: "male",
  getFullName: () => "I am Peter Parker",
};

const { firstName, lastName, getFullName } = testObj;


console.log(getFullName()); // this does  not works

if (typeof getFullName === "function") {
    console.log(getFullName()) // this works
}

Я получаю следующую ошибку: ** Это выражение не вызывается. Не все составляющие типа строка | (() => string) 'вызываются. Тип «строка» не имеет сигнатур вызовов. **

1 Ответ

2 голосов
/ 09 июля 2020

Говоря testObj: ExampleType, вы говорите, что testObj будет объектом, свойства которого равны string или () => string. Это широкое и слабое обещание. Однако вы точно знаете, какие свойства будут какого типа.

Решение первое

Сообщите компилятору все, что вы знаете. Включите конкретные имена свойств в ExampleType.

interface ExampleType {
  firstName: string;
  lastName: string;
  gender: string;
  getFullName: () => string;
}

const testObj = ExampleType = {
  firstName: "Peter",
  lastName: "Parker",
  gender: "male",
  getFullName: () => "I am Peter Parker",
};

const { firstName, lastName, getFullName } = testObj;

console.log(getFullName()); // this works

Решение 2

Если вы хотите использовать ExampleType в качестве чертежа, но хотите указать c свойства, определенные для вас, используйте вспомогательную функцию, например specific, определенную ниже.

interface ExampleType {
  [key: string]: string | (() => string);
}

const specific = <T>() => <U extends T>(argument: U) => argument;

const testObj = specific<ExampleType>()({
  firstName: "Peter",
  lastName: "Parker",
  gender: "male",
  getFullName: () => "I am Peter Parker",
});

const { firstName, lastName, getFullName } = testObj;

console.log(getFullName()); // this works
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...