TypeScript似乎没有缩小符号属性的类型。例如:
const bar = Symbol('bar');
class Foo {
[bar]: string | undefined;
'baz': string | undefined;
}
function getBarLength(f: Foo) {
if (f[bar] === undefined) {
throw new Error('Expected bar to be defined');
}
return f[bar].
我偶然发现了TypeScript类型的问题,当有条件的泛型出现时,我不能将更窄的类型分配给更广泛的类型。但是,所有泛型参数都是完全实例化的,因此TypeScript应该能够完全解析这两种类型,并根据每个属性的类型对它们进行比较。
这是我试图做的抛出错误的简化版本:
// Returns keyes that have type extending Types
type KeysMatching<T, Types> = { [K in keyof T]: T[K] extends Types ? K : never }[keyof T];
type Mapping = {
为什么TypeScript不将对象成员的类型缩小应用于对象类型本身,以便可以将其传递给需要缩小类型的另一个函数?如何在不损失类型安全性的情况下修复/规避此问题? 最小示例: type A = { key: string | null};
type B = {key: string};
function func(a: B) {};
const a: A = {key:'abcd'};
if(typeof(a.key)==='string') {
a.key // has (narrowed) type 'string'
func(a
以以下TypeScript代码为例:
const a: 0 | 1 = 1
if (a === 0) {
console.log('a is 0')
}
if语句将生成以下错误:
This condition will always return 'false' since the types '1' and '0' have no overlap.
(您可以在TypeScript游乐场中使用下面的示例:)
我的问题是,为什么这会导致错误?如果您悬停在a类型上,则它被正确地键入为const a: 0 | 1。如果编译器如
请考虑以下几点:
class TypeCast {
public static void main(String[] args) {
byte by = 4; // Compiler casts int literal to byte
int in = 4;
byte byt = in; // Compilation Error: compiler can not cast automatically. WHY?
}
}
我知道编译器可以在文字赋值的情况下进行缩小。但是,当赋值涉及变量而不是文字时,它就不能这样做。为什么?
编
我目前正在试验excel ListObjects,它是excel表的对象类型。我希望将表列范围存储到变量中。
以下是我所能做的:
'store a group of cells into a range variable
dim rng as Range
set rng = activesheet.Range("A1:A10")
'select a table column
dim table as ListObject
set table = activesheet.listobjects("Table1")
table.ListColumn
给定以下代码片段
let x = {
name: 'John',
age: 30
}
interface Employee {
name:string,
}
let y:Employee = <Employee>x;
console.log(y); //y still have the age property, why
为什么typescript会忽略这个类型转换,有没有其他的解决方案来只获取这些接口属性?
以下代码会导致错误,因为根据TypeScript,类型Pick<Test<T>, Exclude<keyof T, "someKey">>不能赋值给T。当我推断这种类型时,它应该被赋值给T,有没有办法让TypeScript同意我的观点?或者这只是突破了TypeScript中泛型类型的界限,因为不是动态类型的变体可以正确编译。 type Test<T = {}> = T & {
someKey: string
};
function extract<T>(props: Test<T>): T
目前,我们正在将代码库迁移到typescript,我们有很多地方可以使用任何类型的代码。因此,我尝试强制显式设置变量作为任何变量。
下面是示例代码片段。
const a: string = 'h';
const b: any = 4;
const message = a || b;
// Here I would like to get warning that I am assigning any to the message,
// so I would have to write const message: any = a || b;
function say(x
我在TypeScript中使用了TypeScript约束,如下所示:
class Animal {}
class Lion extends Animal {}
class Bear extends Animal {}
class ZooKeeper<T extends Animal> {
constructor(p: T = new Animal()) {
}
}
new ZooKeeper(new Animal());
但是p: T = new Animal()包含一个错误:
“动物”类型不能指定为“T”。
构造器动物()
--为什么是,以及我要做什
我有一个Meta & Tag类型,如下所示:
export type Meta = {
title: string
date: Date
tags: Tag[]
slug: string // uses folder name as a slug
lastmod?: Date
draft?: Boolean
description?: string
image?: string
authors: string[]
readingTime: string
}
export type Tag =
|
我有下面的代码,其中我的getter的返回类型是any,尽管真正的返回类型很明显。还有一些额外的函数可以触发这种行为:
// This is required for repro
const wrapperFunction = <T>(obj: T) => obj;
const store = wrapperFunction({
value: 'Super max',
get simpleGetter() {
return this.value;
},
// This is required for repro
bark()
我想要创建函数类型,其中一个可选参数是必需的。
就我所得到的是做条件类型而言,但问题是在函数中,类型记录不能基于这个条件缩小类型。
type a = { propA: number };
type b = { propB: string };
type OneOfIsRequired = <T extends a | undefined, S extends b | undefined>
(parameterOne: S extends undefined ? a : T, parameterTwo?: T extends undefined ? b : S, x: numb
在Java中,当将double(内存大小)转换为Integer (内存小)时,我们需要强制转换。
int x = (int) 4.3;
但在对象的情况下,如果父类是“哺乳动物”(内存大小较小),其子类是“人”(内存大小较大,因为具有比哺乳动物更多的属性)
然后
Mammal m = new Human(); //works without casting
但是从小到大的转换
Human h = (Human) m ; // needs casting
提前谢谢。
我在我的项目中遇到了这个问题,下面是可以重现它的最小代码。我想知道是TypeScript的bug,还是我用错了。(实际代码比较复杂,但错误是一样的) 错误是:Type 'T' is not assignable to type 'T extends T ? T : T'. 我在TypeScript 3.0.3和3.3.1上测试 function test<T>(arg: T) {
let x: T extends T ? T : T;
x = arg;
}
我一直在使用TypeScript中的条件类型来创建递归部分。我遇到的问题很难在没有示例的情况下解释,所以请看下面的代码(注意:我的特定用例更复杂,但这个示例说明了问题):
// The RecursivePartial type used in the illustration
type RecursivePartial<T> = {
[P in keyof T]?:
T[P] extends (infer U)[] ? RecursivePartial<U>[] :
T[P] extends object ? RecursivePart
为什么TypeScript不缩小数组的类型?
function test(input: (string | number)[]): string[] {
// The type of .map(...) reports that it returns string[].
input = input.map(x => x.toString())
// Type error: Type '(string | number)[]' is not assignable to type 'string[]'.
return input
}
解决方法并