visual studio 2013 - Hvordan refererer jeg til en Typescript-enum inne i en definisjonsfil
Jeg bruker Visual Studio 2013 med oppdatering 4 og Typescript 1.3 installert.
Hvis jeg har en TypeScript-fil, som dette:
MyEnums.ts:
export = MyEnumModule;
module MyEnumModule {
export enum AnEnum { RED, BLUE, GREEN }
}
Og jeg har en definisjonsfil som følger:
MyDefinitions.d.ts:
declare module MyDefinitions {
interface ISomeInterface {
aProperty: string;
aMethod: () => void;
aColor: MyEnumModule.AnEnum;
}
}
Jeg får egentlig en feil som sier "Kan ikke finne navnet 'MyEnumModule'"
Denne enum-filen fungerer fint når den refereres fra TypeScript-filer. For eksempel:
SomeCode.ts:
export = MyCode;
import MyEnums = require('MyEnums');
module MyCode{
export class MyClass implements ISomeInterface {
public aColor: MyEnums.AnEnum = MyEnums.AnEnum.RED;
...and so on
Min forståelse er at det å legge til enten /// <reference ... eller en import ikke vil fungere for en .d.ts-fil (jeg prøvde bare for å være sikker, og det så heller ikke ut til å fungere uansett).
Vet noen hvordan man refererer til en enum i en definisjonsfil som dette?
Takk på forhånd.
--Oppdatering :
Her er feilen jeg ser etter å ha prøvd Steve Fentons anbefalinger nedenfor (med et prøveprosjekt jeg nettopp laget).
MyDefinitions.ts:
import MyEnumModule = require('../App/MyEnums');
declare module MyDefinitions {
interface ISomeInterface {
aProperty: string;
aMethod: () => void;
aColor: MyEnumModule.AnEnum;
}
}
MyEnums.ts:
export = MyEnumModule;
module MyEnumModule {
export enum AnEnum { RED, BLUE, GREEN }
}
MyClass.ts:
export = MyCode;
import MyImport = require('MyEnums');
module MyCode {
export class MyClass implements MyDefinitions.ISomeInterface {
public aColor: MyImport.AnEnum = MyImport.AnEnum.RED;
constructor() { }
aProperty: string = "";
aMethod: () => void = null;
}
}
Mappestruktur:
App
Definisjoner
Inne i MyClass.ts er MyDefinitions.ISomeInterface understreket med rødt med hover-advarsel "Kan ikke finne navnet MyDefinitions".
Jeg har satt AMD for prosjektet
Svar #1
Vet noen hvordan man refererer til en enum i en definisjonsfil som dette?
Det finnes løsninger som Steve Fenton påpekte, men systemet er ikke designet for dette. Du bør referere til andre definisjonsfiler i din definisjonsfil og ikke referere til en *implementeringsfil* (MyEnum.ts) i en definisjonsfil.
Svar #2
Jeg har sjekket dette, og følgende definisjon fungerer for meg, selv om jeg må innrømme at jeg aldri har referert til "faktisk" kode fra "definisjons"-kode - men jeg kan ikke tenke meg noen grunn til ikke å gjøre det.
import MyEnumModule = require('MyEnumModule');
declare module MyDefinitions {
interface ISomeInterface {
aProperty: string;
aMethod: () => void;
aColor: MyEnumModule.AnEnum;
}
}
Om å blande definisjoner og faktiske implementeringer...
Typesystemet i TypeScript er et verktøy for design- og kompileringstid. Når typeinformasjonen konstrueres under designfasen, spiller det ingen rolle om typeinformasjonen er utledet fra implementasjonskode, hentet fra kommentarer som dekorerer implementasjoner, eller kommer fra en ambient erklæring.
Det finnes mange bruksområder for å blande implementasjonskode og ambient-deklarasjoner - hvis du migrerer et JavaScript-program på en million linjer til TypeScript, kan det hende du ikke kan migrere det fra den nederste avhengigheten og oppover. Du kan også plassere ambient-deklarasjoner inne i vanlige filer - ikke bare i definisjonsfiler - hvis du har et stort program, vet du kanskje ikke engang om en type du plasserer i en ambient-deklarasjon er "ekte" eller "ambient".
Den eneste forskjellen mellom implementeringskodetyper og ambient deklarasjonstyper er at typeinformasjonen er rett ved implementeringen i ekte kodefiler, og i en separat fil for ambient deklarasjoner.
Så... hvis du har et problem med å bruke ekte implementerte typer i din ambient-deklarasjon, er det mest sannsynlig forårsaket av noe som kan fikses. Eksemplet jeg ga ovenfor fungerer i et prosjekt jeg har i Visual Studio 2013, Oppdatering 4 - med TypeScript-byggkonfigurasjon satt til å kompilere AMD-moduler. Hvis du kan dele de eksakte detaljene om problemet, hjelper jeg deg gjerne med å få det til å fungere.
Når dette er sagt - hvis du lager en typedefinisjon for trivielle mengder med kode, kan det å lime dem inn i en .ts-fil være enda raskere enn å skrive definisjonen - så du bør gjøre en vurdering fra sak til sak på hvor du skal bruke innsatsen.
