Через интерфейс это не будет работать, но вы можете сделать это:
interface IUserData{
name: string;
gender: string;
secret: string;
}
class PublicUserData {
name: string;
gender: string;
constructor(data: IUserData){
this.name = data.name;
this.gender = data.gender;
}
}
class UserData extends PublicUserData implements IUserData {
secret: string;
constructor(data: IUserData){
super(data);
this.secret = data.secret;
}
}
И так используйте:
var data = {
name: 'Jon',
gender: 'male',
secret: 'xxx'
} as IUserData;
var publicUserData = new PublicUserData(data);
var userData = new UserData(data);
var publicUserData2 = new PublicUserData(userData);
Результат:
publicUserData: {name: "Jon", gender: "male"}
publicUserData2:{name: "Jon", gender: "male"}
userData: {name: "Jon", gender: "male", secret: "xxx"}
Конечно, использование механизма упаковки / распаковки через типы приведения выглядит лучше, но это не может скрыть свойства. Следовательно, необходимо явно указывать типы.