严格定义获取对象的函数的类型,修改其值,并在TypeScript中返回它

时间:2017-02-25 23:07:03

标签: typescript

我想创建一个函数,使用与原始对象相同的键创建一个新对象,但值等于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

2 个答案:

答案 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
}