转换对象属性,以便在打字稿中保留隐式类型

Posted

技术标签:

【中文标题】转换对象属性,以便在打字稿中保留隐式类型【英文标题】:Transform object properties such that implicit typing is retained in typescript 【发布时间】:2015-12-13 11:07:00 【问题描述】:

我正在寻找一种转换函数或方法,它允许我保留 typescript 在结果对象上推断类型(获取类型检查和代码提示)的能力。在下面的示例中,C(和相关的 E)是被证明有问题的场景。

class Wrapper<T> 
    constructor(private val: T)  

    value(): T 
        return this.val;
    


// A 
var wrappedNum = new Wrapper(1);
// Typescript infers value() and that it returns a number
wrappedNum.value().toFixed(1); 

// B
var wrappedNumArray = [1, 2, 3].map(function(val)  return new Wrapper(val); );
// Typescript infers that for each element in array, value() returns number
wrappedNumArray[0].value().toFixed(1); 

// C
// ** Typing of properties is lost in this transformation **
function wrapObject(obj) 
    var targ = ;

    for(var key in obj) 
        targ[key] = new Wrapper(obj[key]);
    

    return targ;


var wrappedObj = wrapObject(a: 1);
// Typescript does not infer the existence of `a` on wrappedObj
wrappedObj.a; 

// D
// Typescript infers `a` and its type
( a: 1 ).a.toFixed(1); 

// E
// ** Typing of properties is lost in this transformation **
function noop(obj) 
    return obj;


// Typescript does not infer the existence of `a` on noop transformed object
noop( a: 1 ).a; 

// F
function getValue() 
    return  a: 1 ;


// Typescript infers the existence of `a` and its type
getValue().a.toFixed(1); 

有没有一种方法可以构建 C&E,使得类型推断可以在不知道传递的对象的结构的情况下工作?

【问题讨论】:

【参考方案1】:

C

对于 C,我想不出办法。一种折衷方案是使用dictionary-like type,然后用泛型映射出来。

例如:

function wrapObject<T>(obj: T) 
    var targ:  [key: string]: Wrapper<T>;  = ;

    for(var key in obj) 
        targ[key] = new Wrapper<T>(obj[key]);
    

    return targ;


var wrappedObj = wrapObject(a: 1);
wrappedObj["a"].value; // ok

E

使用泛型:

function noop<T>(obj: T) 
    return obj;


noop( a: 1 ).a; // works

在Handbook 中阅读有关泛型的更多信息。

【讨论】:

嗯。这对 E 是正确的 - 但对于 C 是不正确的。 wrappedObj.a 似乎具有推断的 number 类型,但实际上是 Wrapper&lt;number&gt;。这种类型系统强制符合wrapObject 上的返回类型注释。 @bjnsn 哎呀,错过了那个细节。就我现在能想到的,这是不可能的。 感谢您的努力。我一直在绞尽脑汁,也没有想到什么。我希望有人比我更熟悉 Typescript!

以上是关于转换对象属性,以便在打字稿中保留隐式类型的主要内容,如果未能解决你的问题,请参考以下文章

对象文字的属性 'children' 隐式具有 'any[]' 类型

编译打字稿时如何防止错误“对象类型的索引签名隐式具有'任何'类型”?

打字稿中对象文字的类型安全合并

在 .NET 中使用隐式转换替代多重继承

Java除了数字类型的自动隐式类型转换,对类有类似功能么?

过滤掉打字稿中接口的不需要的对象属性