小编Jør*_*edt的帖子

Node和docker - 如何处理babel或打字稿?

我有一个节点应用程序,我想在Docker容器中托管,这应该是直截了当的,如本文所示:

https://nodejs.org/en/docs/guides/nodejs-docker-webapp/

但是,在我的项目中,源不能直接运行,必须从ES6和/或Typescript编译.我使用gulp与babel,browserify和tsify一起构建 - 使用不同的浏览器和服务器设置.

在这种情况下,构建和自动化 docker镜像的最佳工作流程是什么?网络上是否有描述此类工作流程的资源?如若Dockerimage做建成后npm install,或者我应该创建一个shell脚本来完成这一切,简单的让Dockerfile收拾它一起?

如果Dockerfile应该进行构建 - 图像需要包含所有dev-dependencies,这是不理想的?

注意:我已经能够设置一个docker容器并运行它 - 但是这需要预先安装和构建所有文件.

babel node.js typescript docker gulp

20
推荐指数
4
解决办法
1万
查看次数

Typescript - 如何检查给定值是否在联合类型数组中

我有一个给定的联合类型的数组,然后想检查数组中是否包含来自联合类型的超集的字符串(运行时检查):

const validOptions: ("foo" | "bar")[] = ["foo", "bar"]
type IArrType = typeof validOptions[number]
const key: IArrType | "alien" = "alien" // Rather: some random function
const isKeyInArr = validOptions.indexOf(key) > -1 // Error: "alien" is not assignable to "foo" | "bar"

// Fix 1:
const isKeyValidCast = validOptions.indexOf(<IArrType>key) > -1 
// Fix 2:
const isKeyValidExplicit = 
      key === "alien" ? false : validOptions.indexOf(key) > -1 // OK: type guard magic
Run Code Online (Sandbox Code Playgroud)

修复1可以,但不是很优雅.修复2愚弄编译器,但是误导和低效的运行时.在我的例子中,"外来"字符串类型只是不在联合类型中的任何字符串的占位符.

有没有什么方法可以在没有强制转换或显式测试的情况下编译?表达式可以否定,以便我们让这个"类型后卫"起作用吗?

顺便说一句:这个非常酷的答案展示了如何从值列表构造一个类型化的元组:Typescript从元组/数组值派生联合类型

typescript

9
推荐指数
2
解决办法
1万
查看次数

Typescript枚举,用于实现和接口

我在CommandEnum.ts中有以下内容:

export enum CommandEnum {
    createProject,
    renameProject,
    hablaBabla
}
Run Code Online (Sandbox Code Playgroud)

在我能够从实现代码中引用的模块中,使用

import {CommandEnum} from '../server/contracts/CommandEnum'

let x = CommmandEnum.hablaBabla
Run Code Online (Sandbox Code Playgroud)

在CommandEnum.js中,枚举文件被编译为带导出逻辑的javascript函数.

这现在工作正常,但我想在我的界面中引用此枚举,我尝试:

/// <reference path="../contracts/CommandEnum.ts" />
namespace ValueTypes {

    export interface Command {
        type : CommandEnum;
        referenceId : string;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,这个引用不会导入CommandEnum类型,但我尝试过的一些其他模块/命名空间/导出组合. 我可以使用参考语法,但不是模块语法,反之亦然 - 但不是两者兼而有之.

这有可能吗?使用纯定义接口文件中的枚举似乎是一种非常常见的场景.但是当实现接口时,枚举必须以"函数形式"提供,并且这两个模型似乎没有结合?

我有类同样的问题,我想命名,.Net风格 - 我不得不放弃.但是,我的接口中没有引用类 - 枚举是.

我使用node.js并编译为单个文件,而不是单个连接的输出.

enums typescript

7
推荐指数
1
解决办法
1万
查看次数

Typescript - 从参数元组中删除最后一个元素,柯里化最后一个参数

我想用打字稿进行柯里化并且有:


const findValueInDb = (value: number, dbSpec: string) => `found it, it's here: ${dbSpec}!`

const createFindValue = (dbSpec: string) =>
    (...params: Omit<Parameters<typeof findValueInDb>, "1">) => findValueInDb(...params, dbSpec)

const theResult = createFindValue("theDb")(10)
Run Code Online (Sandbox Code Playgroud)

这是行不通的,如果在源函数中添加参数的话,也不会很灵活。如何定义柯里化合约?删除最后一个参数但保留其他参数的一个?

typescript

7
推荐指数
1
解决办法
2387
查看次数

打字稿 2 - 在三元/条件运算符表达式中抛出

我尝试编译:

const value = "20"
const x : string | never = "10" === value ? throw Error("bad things") : "hello"
Run Code Online (Sandbox Code Playgroud)

...并在throw- 上出错expression expected。我可以使用就地调用的内联方法解决这个问题,但这看起来不太好。( (() => {throw Error("bad things"})())

为什么不能放入三元运算符的分支?或者是否有另一种有效的语法,也许是我缺少的编译选项?

在变通方法 ( (() => throw Error("bad things")()) 中,如果函数体中没有大括号,Throw 似乎也不起作用。

exception conditional-operator typescript

5
推荐指数
3
解决办法
3469
查看次数

基于字符串参数的打字稿条件返回类型

当使用字符串文字的联合作为输入参数时,删除强制转换并将类型放入函数头中需要什么

const get = <T extends "barcode" | "mqtt">(s: T) =>
    s === "barcode" ?
        <T extends "barcode" ? {scan: () => string} : {pan: () => string}>{scan: () => "we are scanning"} :
        <T extends "barcode" ? {scan: () => string} : {pan: () => string}>{pan: () => "we are panning"}

get("barcode").scan() // OK
get("mqtt").pan()     // OK
get("barcode").pan() // Error
Run Code Online (Sandbox Code Playgroud)

我遇到了这个试图回答别人的问题:https : //stackoverflow.com/a/55059318/2684980

generics typescript

3
推荐指数
1
解决办法
2239
查看次数