Говоря 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