Да, это правильный путь. Целью TS является предоставление типов вместо any
значений из javascript.
Цель состоит в том, чтобы ввести все переменные, если вы не знаете их тип - попробуйте использовать generic
или unknown
вместо any
. Тип def более расширяемый, чем интерфейс def. Интерфейс работает для объектов и классов, тип работает для всего, включая примитивы, объединения и логические выводы, но класс может реализовывать только интерфейсы, а не типы.
Если вам нужно утверждать тип, вы можете использовать защиту типа:
const isNumber = (value: unknown): value is number {
return typeof value === 'number';
}
const something: any = 123;
something += 1; // valid
something.callFake(); // valid
if (isNumber(something)) {
something += 1; // valid
something.callFake(); // invalid
}
В вашем случае можно использовать дженерики.
public addRow(row: Row): boolean {
let constraints: unknown = getConstraints(this.config); // unknown fits too
let table: any = localStorage.getItem(row.tableName);
let rowData = {};
}
public getData<T>( // <- T, when we don't know type.
table_name: string, entity_name?: string,
entity_value?: T
): boolean {
let tableRecord: object[] = [];
let allTableData: Array<object> = JSON.parse(
localStorage.getItem(table_name) || ""
).data;
}
public deleteRecord<T extends string>( // <- T, when we don't know type.
table_name: string,
entity_name: string,
entity_value: T
): boolean {
return !!entity_value; // works
}
public updateRecord<T, D extends object>( // <- T, D, when we don't know type.
table_name: string,
entity_name: string,
entity_value: T,
updation_data: D
): boolean {
if (typeof entity_name === 'string) {
// now we know it's a string.
}
return !entity_value || !updation_data; // works
}