我在 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 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')
将有一个number
as 返回类型。
对于我的用例,我不想为 MyObject 接口中的每个新属性输入更多的重载。我正在寻找具有动态返回类型的解决方案。TypeScript 根据 MyObject 接口自动推导返回类型的一种方式。就像是:
function getValueOfMyObject (key: keyof MyObject): typeof MyObject[key] {
return myObject[key]
}
Run Code Online (Sandbox Code Playgroud)
然而,这似乎不是正确的语法。有没有办法用 TypeScript 实现这一点?
在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)
这里缺少什么?