Estou tentando aprender o texto datilografado. Embora eu não ache que seja relevante, estou usando o VSCode para esta demonstração.
Eu tenho um package.json
que contém estas peças:
{
"devDependencies": {
"gulp": "^3.9.1",
"jspm": "^0.16.33",
"typescript": "^1.8.10"
},
"jspm": {
"moment": "npm:moment@^2.12.0"
}
}
Então eu tenho uma classe Typescript main.js
como esta:
import moment from 'moment';
export class Main {
}
Minha gulpfile.js
aparência é esta:
var gulp = require('gulp');
var typescript = require('gulp-tsb');
var compilerOptions = {
"rootDir": "src/",
"sourceMap": true,
"target": "es5",
"module": "amd",
"declaration": false,
"noImplicitAny": false,
"noResolve": true,
"removeComments": true,
"noLib": false,
"emitDecoratorMetadata": true,
"experimentalDecorators": true
};
var typescriptCompiler = typescript.create(compilerOptions);
gulp.task('build', function() {
return gulp.src('/src')
.pipe(typescriptCompiler())
.pipe(gulp.dest('/dest'));
});
Quando executo o gulp build, recebo a mensagem: "../main.ts(1,25): Cannot file module 'moment'."
Se eu usar import moment = require('moment');
, o jspm funcionará e trará o módulo quando executar o aplicativo, mas continuo recebendo o erro de compilação. Eu também tentei:
npm install typings -g
typings install moment --ambient --save
Em vez de melhorar o problema, ele piorou. Agora recebo o erro acima na compilação, bem como o seguinte:"../typings/browser/ambient/moment/index.d.ts(9,21): Cannot find namespace 'moment'."
Se eu for para o arquivo fornecido por digitação e adicionar no final do arquivo:
declare module "moment" { export = moment; }
Posso fazer com que o segundo erro desapareça, mas ainda preciso da instrução require para conseguir o momento de trabalhar em meu main.ts
arquivo e ainda estou recebendo o primeiro erro de compilação.
Preciso criar meu próprio .d.ts
arquivo por enquanto ou falta apenas alguma configuração?
fonte
import moment, { Moment } from 'moment';
permite que você façaconst x = moment();
econst x: Moment = moment();
Respostas:
Atualizar
Aparentemente, momento agora fornece suas próprias definições de tipo (de acordo com sivabudh pelo menos a partir 2.14.1 para cima), assim você não precisa
typings
ou@types
em tudo.import * as moment from 'moment'
deve carregar as definições de tipo fornecidas com o pacote npm.Dito isso, no entanto, como dito em moment / pull / 3319 # issuecomment-263752265, a equipe do momento parece ter alguns problemas para manter essas definições (eles ainda estão procurando por alguém que as mantém) .
Você precisa instalar
moment
tipificações sem a--ambient
bandeira.Em seguida, inclua-o usando
import * as moment from 'moment'
fonte
--ambient
bandeira e não usar ? Consegui que o numeraljs trabalhasse com a ambient flag. Além disso, sua página principal npmjs.com/package/typings dá o exemplo usando o sinalizador de ambiente. Não sei quando quero / preciso usar um em vez do outro. Obrigado!--ambient
sinalizador para todas as definições de Typescript detypings
/,DefinitelyTyped
mas amoment
definição tem uma estrutura estranha e os arquivos não são baixados corretamente. Se você olhar o arquivo de definição moment.d.ts, ele contém apenas uma referência à versão do nó, que não é resolvida no download (pode valer a pena abrir um problema).Você precisa importar moment () a função e Moment a classe separadamente no TS.
Eu encontrei uma nota na documentação datilografada aqui .
Portanto, o código para importar moment js para o texto digitado realmente se parece com este:
fonte
import * as moment from 'moment';
e depois usadomoment.Moment
para digitações.moment.Moment
interface diretamente do namespacemoment
Não tenho certeza de quando isso mudou, mas com a última versão do typescript, você só precisa usar
import moment from 'moment';
e tudo o mais deve funcionar normalmente.ATUALIZAR:
Parece que o momento recente corrigiu sua importação. Pelo menos
2.24.0
você vai querer usarimport * as moment from 'moment';
fonte
import * as moment from 'moment'
não funcionará com texto datilografado, masimport moment from 'moment'
funciona.esModuleInterop
set totrue
na minha configuração, que obtive com esta resposta . Obrigado.via digitação
Moment.js agora oferece suporte a TypeScript na v2.14.1.
Veja: https://github.com/moment/moment/pull/3280
Diretamente
Pode não ser a melhor resposta, mas este é o caminho da força bruta e funciona para mim.
moment.js
arquivo real e incluí-lo em seu projeto.$ tree . ├── main.js ├── main.js.map ├── main.ts └── moment.js
`` `
node
para corrermain.js
.fonte
Acabei de notar que a resposta que votei e comentei é ambígua. Portanto, o que se segue é exatamente o que funcionou para mim. Atualmente estou no Moment
2.26.0
and TS3.8.3
:Em código:
Na configuração do TS:
Estou construindo para tanto commonjs e EMS para que esta configuração é importado para outros arquivos de configuração.
O insight vem desta resposta que se refere ao uso do Express. Achei que valia a pena adicionar aqui, porém, para ajudar qualquer pessoa que pesquisa em relação ao Moment.js, ao invés de algo mais geral.
fonte
moment()
normalmente em vez demoment.default()
1. momento de instalação
2. teste este código em seu arquivo typescript
fonte
Ainda quebrado? Tente desinstalar
@types/moment
.Então, removi o
@types/moment
pacote dopackage.json
arquivo e funcionou usando:As versões mais recentes
moment
do não requerem o@types/moment
pacote porque os tipos já estão incluídos.fonte