Estoy tratando de crear una Declaración Mecanografiada para uuidv5, es mi primera declaración para un módulo de terceros y están usando una construcción que no entiendo. El módulo desnudo se ve así:

function uuidToString(uuid) {
}

function uuidFromString(uuid) {
}

function createUUIDv5(namespace, name, binary) {
}

createUUIDv5.uuidToString = uuidToString;
createUUIDv5.uuidFromString = uuidFromString;

module.exports = createUUIDv5;

Intenté crear una declaración como esta:

declare module uuidv5 {
    type uuid = string | Buffer
    enum space { dns, url, oid, x500, null, default }
    type ns = uuid | space

    export interface createUUIDv5 {
        (namespace: ns, name: uuid): uuid;
        (namespace: ns, name: uuid, binary: boolean): uuid;

        uuidToString(uuid: Buffer): string;
        uuidFromString(uuid: string): Buffer;
        createUUIDv5: uuidv5.createUUIDv5;
        space: uuidv5.space;
    }
}

declare const exp: uuidv5.createUUIDv5;
export = exp;

Que casi ha obtenido lo que quiero, excepto por el hecho de que no puedo acceder al espacio enum usando

var uuidNs = uuidv5(uuidv5.spaces.null, "My Space", true);
                    ------------------
var uuid = uuidv5(uuidNs, "My Space", true);

Revisé los documentos, pero no puedo encontrar una manera de agregar esa enumeración allí mientras aún puedo usarla para la definición de tipo en la parte superior ...

2
jessehouwing 14 ene. 2017 a las 23:08
¿Estás intentando exportar la enumeración space del módulo?
 – 
timocov
16 ene. 2017 a las 01:48
Creo que soy. Quiero poder usarlo desde el código de llamada, en este momento no aparece ni se compila cuando intento usarlo.
 – 
jessehouwing
16 ene. 2017 a las 02:12

1 respuesta

La mejor respuesta
declare module uuidv5 {
    type uuid = string | Buffer
    enum space { dns, url, oid, x500, null, default }
    type ns = uuid | space

    export interface createUUIDv5 {
        (namespace: ns, name: uuid): uuid;
        (namespace: ns, name: uuid, binary: boolean): uuid;

        uuidToString(uuid: Buffer): string;
        uuidFromString(uuid: string): Buffer;
        createUUIDv5: uuidv5.createUUIDv5;
        spaces: typeof uuidv5.space; // notice this line
    }
}

declare const exp: uuidv5.createUUIDv5;
export = exp;

No recomiendo utilizar el formato declare module uuidv5, ya que está obsoleto. El módulo ambiental compatible con el módulo ES6 es mejor.

declare module 'uuidv5' {
    type uuid = string | Buffer
    enum space { dns, url, oid, x500, null, default }
    type ns = uuid | space

    interface createUUIDv5 {
        (namespace: ns, name: uuid): uuid;
        (namespace: ns, name: uuid, binary: boolean): uuid;

        uuidToString(uuid: Buffer): string;
        uuidFromString(uuid: string): Buffer;
        createUUIDv5: createUUIDv5;
        spaces: typeof space;
    }
    var exp: createUUIDv5
    export = exp
}

En uso:

import * as uuidv5 from 'uuidv5'

var uuidNs = uuidv5(uuidv5.spaces.null, "My Space", true);
2
Herrington Darkholme 17 ene. 2017 a las 05:32
¡Gracias! Eso funcionó perfectamente. Una vez que vea la respuesta, se vuelve tan obvio :).
 – 
jessehouwing
17 ene. 2017 a las 11:13