小编Kee*_*rop的帖子

对返回对象文字的 Array.map 进行类型检查

我在 TypeScript playground创建了这个例子

interface Test{
    a: string
    b: string
}

const object: Test = {
    a: 'b',
    b: 'c',
}

function testIt(): Test[] {
    const data = [{b: '2', c: '3'}]
    const prices: Test[] = data.length ? data.map((item) => {
        return {
            a: item.b,
            b: item.c,
            c: '2',
            d: '3'
        }
    }) : [];
    return prices;
}
Run Code Online (Sandbox Code Playgroud)

从数组映射方法中的对象返回语句中删除 a 或 b 属性会导致 TypeScript 错误(如预期)。

添加 c 或 d 或任何其他随机未知属性不会触发 TypeScript 错误。我怀疑这只有在接口包含 [x: string]: any 时才有可能。

那么为什么 Array.map 对接口上缺失的属性进行类型检查,而不是对其他/未知属性进行类型检查?

typescript

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

如何使用 TypeScript 从接口动态推导类型?

TypeScript Docs描述了如何使用函数重载。

以下用例是静态定义的重载函数的示例。

interface MyObject {
    a: boolean
    b: number
}

const myObject: MyObject = {
    a: true,
    b: 1
}

function getValueOfMyObject (key: 'a'): boolean
function getValueOfMyObject (key: 'b'): number
function getValueOfMyObject (key: keyof MyObject): boolean | number {
    return myObject[key]
}
Run Code Online (Sandbox Code Playgroud)

所以,

getValueOfMyObject('a')将有一个boolean作为返回类型,并且

getValueOfMyObject('b')将有一个numberas 返回类型。

对于我的用例,我不想为 MyObject 接口中的每个新属性输入更多的重载。我正在寻找具有动态返回类型的解决方案。TypeScript 根据 MyObject 接口自动推导返回类型的一种方式。就像是:

function getValueOfMyObject (key: keyof MyObject): typeof MyObject[key] {
    return myObject[key]
}
Run Code Online (Sandbox Code Playgroud)

然而,这似乎不是正确的语法。有没有办法用 TypeScript 实现这一点?

types typescript

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

DynamoDB扫描遗漏了有效项

在DynamoDB表中,我有一个具有以下方案的项目:

{
    id: 427,
    type: 'page',
    ...other_data
}
Run Code Online (Sandbox Code Playgroud)

在查询主索引(id)时,我得到了按预期返回的项目。

通过scan在AWS DynamoDB Web应用程序内部执行的操作来获取所有类型为的page项目,将返回188个项目(包括此缺失项目)。但是,使用AWS开发工具包在Lambda中执行此扫描操作,仅返回162个项目。部分代码如下所示:

const params = { 
    TableName: <my-table-name>,
    FilterExpression: '#type = :type',
    ExpressionAttributeNames: { '#type': 'type' },
    ExpressionAttributeValues: { ':type': 'page' }
};

dynamodb.scan(params, (error, result) => {
    if (error) {
      console.log('error', error);
    } else {
      console.log(result.Items); // 162 items
    }
});
Run Code Online (Sandbox Code Playgroud)

这里缺少什么?

amazon-web-services node.js amazon-dynamodb aws-lambda

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