Typescript объекты или классы: невозможно иметь дополнительные свойства, когда класс реализует интерфейс? - PullRequest
0 голосов
/ 09 января 2020

Мне было интересно, почему невозможно реализовать дополнительные свойства или функции внутри класса машинописи, когда этот класс реализует интерфейс ... он говорит: ... "Object literal may only specify known properties and "FirstName" does not exist in type persInterface" .. Я думаю, что в java также возможно Реализуя другие подпорки или функции, интерфейс Implementas - это просто обязательное подмножество класса, а не ограничение. Это нормальное поведение в Typescript?

interface persInterface {
         lastName: String,
         sayHello: () => number
     }

 var person: persInterface = { 
    FirstName:"Tom", 
    lastName:"Hanks", 
    sayHello: ()=>{ return 10} ,
 };

1 Ответ

1 голос
/ 09 января 2020

Вы говорите о классах, реализующих интерфейсы, но тогда ваш пример кода не делает этого, он просто имеет литерал объекта. С этим литералом объекта вы определили, что это будет точно persInterface, поэтому вы получаете сообщение об ошибке при попытке добавить свойство, не являющееся частью persInterface.

Если вы действительно попытайтесь создать класс, который реализует интерфейс, тогда вы можете делать то, что вы хотите, без каких-либо ошибок типа ( детская площадка ):

interface persInterface {
  lastName: string,
  sayHello: () => number
}

class Person implements persInterface {
  firstName: string;
  lastName: string;
  constructor(firstName: string, lastName: string) {
    this.firstName = firstName;
    this.lastName = lastName;
  }

  sayHello(): number {
    return 10;
  }
}


const person = new Person('tom', 'hanks');

Если вы работаете с литералами затем вы захотите создать интерфейс, выходящий из базового интерфейса, и указать дополнительные свойства:

interface persInterface {
  lastName: string,
  sayHello: () => number
}

interface persPlusPlus extends persInterface {
  lastName: string
}

const person: persPlusPlus = { 
  firstName:"Tom", 
  lastName:"Hanks", 
  sayHello: ()=> { return 10; } ,
};
...