我想创建一个函数,使用与原始对象相同的键创建一个新对象,但值等于null
。
因此...
function nullify(arg) {
var returnObj = {}
for (var key in arg) {
returnObj[key] = null
}
return returnObj
}
我想在此函数中添加类型,以便当我尝试访问返回对象上不存在的属性时,TypeScript编译器会发出警告。例如:
var nulled = nullify({
a: 1,
b: 2
})
console.log(nulled.foobar) // Error `foobar` doesn't exist.
这样的事情可能吗?也许通过使用泛型和keyof
?
抱歉,这里有一个完整的TypeScript noob
答案 0 :(得分:5)
使用TS 2.1时,您可以使用映射类型。默认情况下,类型通常为type | number
。但是,如果使用映射类型严格检查空对象,则采用更具描述性的方法。
type Nullified<T> = {
[P in keyof T]?: null
}
function nullify<T>(arg:T) : Nullified<T> {
var returnObj = {}
for (var key in arg) {
returnObj[key] = null
}
return returnObj
}
答案 1 :(得分:2)
您可以使用泛型执行此操作:
function nullify<T>(arg: T): T {
var returnObj = {} as T;
for (var key in arg) {
returnObj[key] = null
}
return returnObj
}
用法:
var nulled = nullify({
a: 1,
b: 2
})
console.log(nulled.a); // No problem
console.log(nulled.x); // Compiler error Property 'x' does not exist on type '{ a: number; b: number; }'.
请注意,调用函数时无需指定泛型类型。该类型由编译器从传递给函数的参数自动派生。
扩展和更正Paarth's answer:使用严格空检查并且 TypeScript 2.1或更高版本可用时,您可能希望声明返回的类型以允许null其属性的值:
// Defined mapped type Nullified from type T.
// Mapped type has all the same properties with the
// same types except that the properties in Nullified
// can also be null
type Nullified<T> = {
[P in keyof T]: T[P] | null
}
function nullify<T>(arg: T): Nullified<T> {
var returnObj = {} as Nullified<T>;
for (var key in arg) {
returnObj[key] = null
}
return returnObj
}