Alguém sabe como transmitir em TypeScript?
Estou tentando fazer isso:
var script:HTMLScriptElement = document.getElementsByName("script")[0];
alert(script.type);
mas está me dando um erro:
Cannot convert 'Node' to 'HTMLScriptElement': Type 'Node' is missing property 'defer' from type 'HTMLScriptElement'
(elementName: string) => NodeList
Não consigo acessar o membro 'type' do elemento de script, a menos que seja convertido para o tipo correto, mas não sei como fazer isso. Pesquisei os documentos e as amostras, mas não consegui encontrar nada.
typescript
Spongman
fonte
fonte
Respostas:
O TypeScript usa '<>' para cercar as transmissões, de modo que o acima se torna:
No entanto, infelizmente você não pode fazer:
Você recebe o erro
Mas você pode fazer:
fonte
(<NodeListOf<HTMLScriptElement>>document.getElementsByName(id))[0];
A partir do TypeScript 0.9, o
lib.d.ts
arquivo usa assinaturas especializadas de sobrecarga que retornam os tipos corretos para chamadas paragetElementsByTagName
.Isso significa que você não precisa mais usar asserções de tipo para alterar o tipo:
fonte
Você sempre pode hackear o sistema de tipos usando:
fonte
Não digite elenco. Nunca. Use proteções de tipo:
Deixe o compilador fazer o trabalho por você e cometer erros quando suas suposições forem erradas.
Pode parecer um exagero nesse caso, mas ajudará bastante se você voltar mais tarde e alterar o seletor, como adicionar uma classe que está faltando no dom, por exemplo.
fonte
Para terminar com:
Array
objeto real (nãoNodeList
vestido como umArray
)HTMLElements
, nãoNode
é lançada à força paraHTMLElement
sTente o seguinte:
Aproveitar.
fonte
Poderíamos digitar nossa variável com um tipo de retorno explícito :
Ou afirme como (necessário com o TSX ):
Ou, em casos mais simples, afirme com a sintaxe entre colchetes angulares .
Documentação:
TypeScript - Tipos básicos - asserções de tipo
fonte
Apenas para esclarecer, isso está correto.
como
NodeList
não é uma matriz real (por exemplo, não contém.forEach
,.slice
,.push
, etc ...).Portanto, se ele fosse convertido para
HTMLScriptElement[]
no sistema de tipos, você não obteria erros de tipo se tentasse chamarArray.prototype
membros nele no tempo de compilação, mas falharia no tempo de execução.fonte
Isso parece resolver o problema, usando o
[index: TYPE]
tipo de acesso à matriz, felicidades.fonte
Pode ser resolvido no arquivo de declaração (lib.d.ts) se o TypeScript definir HTMLCollection em vez de NodeList como um tipo de retorno.
O DOM4 também especifica isso como o tipo de retorno correto, mas as especificações DOM mais antigas são menos claras.
Consulte também http://typescript.codeplex.com/workitem/252
fonte
Como é um
NodeList
, não umArray
, você realmente não deveria usar colchetes ou moldarArray
. A maneira da propriedade de obter o primeiro nó é:Você pode apenas transmitir isso:
Ou estenda
NodeList
:fonte
const script = document.getElementsByName(id).item(0) as HTMLScriptElement;
Eu também recomendaria os guias do sitepen
https://www.sitepen.com/blog/2013/12/31/definitive-guide-to-typescript/ (veja abaixo) e https://www.sitepen.com/blog/2014/08/22/advanced -typescript-conceitos-classes-tipos /
fonte
fonte