Как структурировать класс утилиты
У меня есть несколько функций полезности. Каков наилучший способ их упаковки, а затем импортировать?
Это то, что я пытаюсь сделать:
import * as util from './util'
export class myClass{
constructor()
{
util.doSomething("test");
}
}
Тогда в классе:
export class Util{
doSomething(val: string){ return val;}
doSomethingElse(val: string{ return val;}
}
Сообщение об ошибке, которое я получаю от VS, это "Свойство doSomething не существует в типе util."
Ответы
Ответ 1
Если вы создаете файл utils.ts
, который содержит
export default class Utils {
static doSomething(val: string) { return val; }
static doSomethingElse(val: string) { return val; }
}
то вы можете упростить свой код клиента следующим образом:
import Utils from './utils'
export class MyClass {
constructor()
{
Utils.doSomething("test");
}
}
Ответ 2
Здесь пара проблем:
- Вы ничего не создаете, а
doSomething
- это метод экземпляра
- Когда вы выполняете
import * as util
, util
представляет модуль, а не объект в нем.
Если вы хотите util
, вы должны просто импортировать это:
import { Util } from './util'
Затем вы должны создать экземпляр util
, прежде чем, наконец, назовите метод на нем:
var u = new Util();
u.doSomething("test");
Здесь ваш код исправлен:
import { Util } from './util'
export class MyClass{
constructor()
{
var u = new Util();
u.doSomething("test");
}
}
Все, что сказал, кажется, что-то странное в том, как вы используете свои утилиты. Это полностью личное мнение, но я бы не вызывал методы, которые "что-то делают", т.е. Вызывают побочные эффекты, в конструкторе.
Кроме того, методы в util
действительно не выглядят так, как будто они должны быть в этом классе, поскольку класс не содержит состояния, от которого они зависят. Вы всегда можете экспортировать регулярные функции из модуля. Если вы написали свой модуль utils следующим образом:
export function doSomething(val: string) { return val; }
export function doSomethingElse(val: string) { return val; }
вы будете экспортировать свои функции напрямую и уклонитесь от проблем с созданием, и на самом деле ваш исходный код будет работать правильно, как есть.
Ответ 3
Или вы можете экспортировать это как объектный литерал:
export const Util = {
doSomething(val: string){ return val;},
doSomethingElse(val: string{ return val;}
}
Ответ 4
Вы также можете создать класс util.ts, который имеет функцию для экспорта
export const formatDateOfBirth =
(dob: string) : string => '${dob.substring(0, 4)}-${dob.substring(4, 6)}-${dob.substring(6, 8)}';
Теперь вы можете импортировать метод, как показано ниже, структура общих папок src> app> shared, я вызываю этот импорт в файле src> app> shelf> shelf.component.ts
import { formatDateOfBirth } from '../shared/utils/util';
public getFormattedDate(dob: string):string{
return formatDateOfBirth(dob);
}
Ответ 5
Альтернативный способ:
1) Экспортируйте константы в ваш файл utils.ts:
export const doSomething = (val: string): any => {
return val;
};
export const doSomethingElse = (val: string): any => {
return val;
};
2) Импортируйте и используйте эти методы в основном файле *.ts:
import { doSomething, doSomethingElse } from './util';
...
let value1 = doSomething('abc');
let value2 = doSomethingElse ('efg');