copal
@copal
𝄞 ...оооо baby

Как создать типизированный интерфейс?

Есть класс, тип свойства которого не может быть известен заранее. То есть
class SomeClass {
    public data: any;
}

По этому хочется сделать что-то вроде -
interface IData<any> {}

class SomeClass {
    public data: IData<any>;
}

И уже потом добавлять тип
interface IData<any> {}
interface ISomeData {
    value: number;
}
class SomeClass {
    public data: IData<any>;
}

let data: IData<ISomeData> = new SomeClass().data;

Как такое сделать?
  • Вопрос задан
  • 317 просмотров
Решения вопроса 1
@bromzh
Drugs-driven development
1) Параметризовать класс:
class SomeClass<T> {
    public data: T;
}
let numData: number = new SomeClass<number>().data;
let strData: string = new SomeClass<string>().data;


2) Кастовать типы:
class SomeClass {
	data: any;
}
let numData: number = new SomeClass().data as number;
let strData: string = new SomeClass().data as string;

Но важно помнить, что в рантайме этих типов не будет. На самом деле, если в поле data лежит число, а ты кастуешь в строку, то реально никакого преобразования не произойдёт.

Ещё стоит посмотреть сюда: https://www.typescriptlang.org/docs/handbook/advan...
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Maa-Kut
Интерфейс нужен для описания некоего общего контракта, который обязаны поддерживать все реализации этого интерфейса. В данном случае IData никаких контрактов не реализует и, как по мне, никакого смысла не имеет. Если нужно хранить в SomeClass данные любых типов, то пусть так и остается any, который затем при необходимости можно будет кастить во что угодно.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы