关于 TypeScript{}
类型的问题- 到目前为止,我认为它的意思是“没有属性的空对象”类型,但最近我偶然发现了禁止使用{}
类型的eslint 规则,因为这意味着“任何非空值”。打字稿游乐场中的快速测试表明这是真的:
let d: {} = {};
d = false;
Run Code Online (Sandbox Code Playgroud)
此代码不会给出编译器错误,但是当我尝试分配null
给 d 时,确实存在错误。所以我的问题是:
{}
TypeScript 中的实际类型是什么?它真的代表“任何非空值”(在 TypeScript 文档中找不到确认)?
我应该如何实际输入“没有任何属性的空对象”?
让我说我有一个方法的对象文字:
const testObj = {
method: function() {
console.log('declaration');
}
}
Run Code Online (Sandbox Code Playgroud)
与另一种方式定义的metod相同的对象:
const testObj = {
method() {
console.log('declaration');
}
}
Run Code Online (Sandbox Code Playgroud)
在上面两个例子中定义方法字段之间有什么区别?我知道函数提升和函数声明可以在它们出现在代码中之前使用,但是当将函数定义为对象字段时,它似乎并不重要.
我正在尝试在 JS ES6 类中实现单例模式。这是我到目前为止所写的:
let instance;
export class TestClass{
constructor(){
if(new.target){
throw new Error(`Can't create instance of singleton class with new keyword. Use getInstance() static method instead`);
}
}
testMethod(){
console.log('test');
}
static getInstance(){
if(!instance) {
instance = TestClass.constructor();
}
return instance;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我调用静态方法时TestClass.getInstance()
,我没有得到类对象的实例,我得到了
ƒ anonymous() {
}
Run Code Online (Sandbox Code Playgroud)
函数,无需访问 testMethod。我在我的代码中找不到错误 - 将不胜感激。
我正在尝试在 Node.js + TypeScript 中使用 Sequelize。我正在尝试使用以下简单的代码:
import {Sequelize, Model, DataTypes} from 'sequelize';
const sequelize = new Sequelize('base', 'user', 'pass', {dialect: 'mysql'});
class User extends Model {
}
User.init({
id: {
type: DataTypes.INTEGER.UNSIGNED,
autoIncrement: true,
primaryKey: true,
unique: true,
},
login: {
type: DataTypes.STRING(255),
allowNull: false,
unique: true,
},
password: {
type: DataTypes.STRING(255),
allowNull: false,
},
}, {
tableName: 'users',
sequelize,
});
sequelize.sync().then(() => {
User.create({
login: 'aaaa',
password: 'bbbb',
});
});
Run Code Online (Sandbox Code Playgroud)
但是,当尝试运行编译的代码时,我收到以下错误:
未处理的拒绝类型错误:类构造函数模型无法在没有“new”的情况下调用
据我了解,这不是sequelize的问题:与javascript代码运行相同的代码运行没有问题,并在数据库正确的表中创建记录。我知道这是将 ES6 类转换为 ES5 的问题,但是我无法修复此错误。这是我的 tsconfig.json:
{ …
Run Code Online (Sandbox Code Playgroud) 我有用 Node.js 编写的应用程序服务器,它将文件上传到 AWS S3 存储。为此,我使用https://www.npmjs.com/package/aws-sdk,当我连接并上传到我的 AWS 生产存储时,它工作正常。但是在开发过程中,我想将文件上传到本地 MinIO 服务器(从 docker 镜像创建https://hub.docker.com/r/minio/minio/):
docker run -p 9000:9000 -p 9001:9001 \
quay.io/minio/minio server /minio --console-address ":9001"
Run Code Online (Sandbox Code Playgroud)
MinIO 服务器本身工作正常,我可以在本地登录、创建存储桶等。但是,当我尝试使用适用于 Node.js 的 AWS SDK 将文件上传到本地 MinIO 存储时,我无法执行此操作:
import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3';
#s3Client = new S3Client({
credentials: {
accessKeyId: config.getAwsStorageAccessKeyId(), // from env variables
secretAccessKey: config.getAwsStorageSecretAccessKey(),
},
...(globalConfig.isReleaseVersion() && {
endpoint: config.getAwsStorageEndpoint(), // from env "http://localhost:9001"
}),
});
Run Code Online (Sandbox Code Playgroud)
后来我尝试上传对象:
await this.#s3Client.send(new PutObjectCommand({
Bucket: config.getAwsStorageWebflowBucketName(), // from env "test" …
Run Code Online (Sandbox Code Playgroud) 我有异步功能,我想让它执行到某一点,暂停执行,并在用户做出某些动作(例如点击按钮)时恢复执行功能.我试过这个:
let changed = false;
let promise = new Promise(function(resolve, reject){
if(changed){
resolve('success');
}else{
reject('failure');
}
});
async function test(){
console.log('function started');
console.log('before await');
try{
const fulfilledValue = await promise;
console.log(fulfilledValue);
}catch(failure){
console.log(failure);
}
console.log('after await');
};
document.getElementById('change').addEventListener('click', function(){
if(!changed){
console.log('changed = true');
changed = true;
}else{
changed = false;
}
});
test();
Run Code Online (Sandbox Code Playgroud)
但它不能像我想的那样工作.异步功能不会等到用户操作.据我所知,这是因为承诺立即被拒绝,因为"changed"标志最初设置为false.如何修复此代码以按预期工作?有可能吗?
我有一个简单的ES6类,我想知道如何在JSDoc中正确地描述它。请注意,我想定义自己的类型,稍后WebStorm自动完成功能将识别出该类型。
以下示例有效吗?
/**
* @typedef {Object} View
* @class
*/
class View{...}
Run Code Online (Sandbox Code Playgroud) 我有以下HTML代码:
<div class="col-sm-4">
<div class="form-group" class="form-inline">
<span style="white-space: nowrap">
<label for="size">Board size:</label>
<select class="form-control" id="size" style="background-color: black; color: silver">
<option>small</option>
<option>medium</option>
<option>large</option>
<option>huge</option>
</select>
</span>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
我想要实现的是选择表单及其标签在同一行.我尝试从stackoverflow的类似问题中应用解决方案.Span with white-space: nowrap
不起作用,既没有也没有class="form-inline"
回答这个问题:在Bootstrap 3中的同一行中选择下拉按钮和表单 如何解决?
我有一个固定宽度和高度的表,包含三行和三列.行和列的大小自动相等,但是当我将innerHTML
(或图像)放入表格单元格时,内部文本的单元格会以其他列的成本展开.内容插入后如何防止表格单元格扩展?我尝试过类似堆栈溢出问题的解决方案,但没有任何效果.
JS小提琴:https://jsfiddle.net/m20akmdx/14/
document.getElementById('8').innerHTML = 'R';
Run Code Online (Sandbox Code Playgroud)
table {
width: 360px;
height: 360px;
border: 1px solid black;
border-collapse: collapse;
}
td {
border: 1px solid black;
text-align: center;
}
Run Code Online (Sandbox Code Playgroud)
<table id="table">
<tr>
<td id="1"></td>
<td id="2"></td>
<td id="3"></td>
</tr>
<tr>
<td id="4"></td>
<td id="5"></td>
<td id="6"></td>
</tr>
<tr>
<td id="7"></td>
<td id="8"></td>
<td id="9"></td>
</tr>
</table>
Run Code Online (Sandbox Code Playgroud)
根据文档,我可以使用预定义的排除类型从某些类型中排除某些属性:
type Test = string | number | (() => void);
type T02 = Exclude<Test, Function>;
Run Code Online (Sandbox Code Playgroud)
但是,如果我有 Test 接口而不是 Test 类型,它似乎不起作用。如何在以下情况下获得类似的结果?
interface Test {
a: string;
b: number;
c: () => void;
}
// get somehow interface with excluded function properties??
Run Code Online (Sandbox Code Playgroud) javascript ×4
ecmascript-6 ×3
typescript ×3
css ×2
es6-class ×2
html ×2
node.js ×2
amazon-s3 ×1
async-await ×1
constructor ×1
es6-promise ×1
html-table ×1
jsdoc ×1
minio ×1
singleton ×1
webstorm ×1