我有一个节点应用程序,我想在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容器并运行它 - 但是这需要预先安装和构建所有文件.
我有一个给定的联合类型的数组,然后想检查数组中是否包含来自联合类型的超集的字符串(运行时检查):
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从元组/数组值派生联合类型
我在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并编译为单个文件,而不是单个连接的输出.
我想用打字稿进行柯里化并且有:
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)
这是行不通的,如果在源函数中添加参数的话,也不会很灵活。如何定义柯里化合约?删除最后一个参数但保留其他参数的一个?
我尝试编译:
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 似乎也不起作用。
当使用字符串文字的联合作为输入参数时,删除强制转换并将类型放入函数头中需要什么:
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。